2016-08-25 29 views
2

我看着那两个:Alamofire重试请求 - 反应方式

,并试图创造similiar的事情,但没有莫亚,使用Alamofire + RxSwift 。

首先显然我应该坚持这个,因为我的实现分为几个较小的部分。所有的 首先我有我的生成反应请求自定义的方法:

static func rx_request<T>(requestConvertible: URLRequestConvertible, completion: (Request) -> Observable<T>) -> Observable<T> { 
    let manager: Manager = Manager.sharedInstance 
    return manager 
     .rx_request { manager -> Request in 
      return Alamofire.request(requestConvertible) 
     } 
     .flatMap { request -> Observable<T> in 
      return completion(request) 
     } 
     .shareReplay(1) 
} 

这就是后来被特定Request的便利类。比如我UserRequests有这个私有扩展,从它的方法提取一些常用代码:

private extension Request { 

    func rx_userRequest() -> Observable<User> { 
     return self 
      .validate() 
      .rx_responseJSON() 
      .flatMap{ (request, json) -> Observable<User> in 
       guard 
        let dict = json as? [ String: AnyObject ], 
        let parsedUser: User = try? Unbox(dict) else { 
         return Observable.error(RequestError.ParsingError) 
       } 

       return Observable.just(parsedUser) 
      } 
      .rx_storeCredentials() 
    } 

} 

因为事情怎么看起来像我不知道whare是在正确地方放retry方法,以及如何实现它?因为根据位置我可以得到不同的输入参数。

回答

1

重试代码必须在第一次尝试之后执行,即rx_responseJSON,因此您现在已经设置了一些东西,它必须在它和之后的flatMap之间。