在 RxSwift 4.0.0 中正确使用 retryWhen 运算符
Posted
技术标签:
【中文标题】在 RxSwift 4.0.0 中正确使用 retryWhen 运算符【英文标题】:correct use of retryWhen operator with RxSwift 4.0.0 【发布时间】:2018-02-01 08:22:35 【问题描述】:在 RxSwift 3.6.1 中,我对 ObservableType 进行了此扩展,以在错误请求后获取新令牌:
public extension ObservableType where E == Response
public func retryWithToken() -> Observable<E>
return retryWhen error -> Observable<Response> in
return error.flatMap( (error) -> Observable<Response> in
if let myApiError: MyApiError = error as? MyApiError
if (myApiError == MyApiError.tokenError)
return Session.shared.myProvider.request(.generateToken)
else
return Observable.error(myApiError)
return Observable.error(error)
)
然后我就可以使用它了:
Session.shared.myProvider.rx
.request(.mySampleRequest)
.filterSuccessfulStatusCodes()
.retryWithToken()
.subscribe event in
....
.disposed(by: self.disposeBag)
但是现在使用 RxSwift 4.0.0 的序列期望
PrimitiveSequence<SingleTrait, Response>
有人可以向我解释如何使用 RxSwift 4.0.0 做同样的事情吗?我尝试使用 PrimitiveSequence 的扩展,但出现了一些编译错误。
【问题讨论】:
【参考方案1】:我相信这与RxSwift
无关,而是Moya
的变化。 MoyaProvider.rx.request
返回 Single
,这是 PrimitiveSequence
的类型别名,而不是 ObservableType
。
你在ObservableType
上声明你的函数。
所以在retryWithToken()
之前做asObservable()
【讨论】:
以上是关于在 RxSwift 4.0.0 中正确使用 retryWhen 运算符的主要内容,如果未能解决你的问题,请参考以下文章