Alamofire 重试请求 - 反应方式
Posted
技术标签:
【中文标题】Alamofire 重试请求 - 反应方式【英文标题】:Alamofire retry request - reactive way 【发布时间】:2016-08-25 07:00:52 【问题描述】:我在看那两个:
http://sapandiwakar.in/refresh-oauth-tokens-using-moya-rxswift/ Using retryWhen to update tokens based on http error code并尝试使用 Alamofire + RxSwift 创建类似的东西,但没有 Moya。
首先显然我应该把它放在哪里,因为我的实现分为几个较小的部分。 首先,我有生成 reactive 请求的自定义方法:
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
s 便利类使用。例如我的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()
因为事情看起来像我想知道放置retry
方法的正确位置是什么以及如何实现它?因为根据位置,我可以获得不同的输入参数。
【问题讨论】:
【参考方案1】:重试代码必须在第一次尝试之后进行,即rx_responseJSON
,所以按照您现在设置的方式,它必须在它和之后的flatMap
之间。
【讨论】:
以上是关于Alamofire 重试请求 - 反应方式的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求