在 RxSwift 4.0.0 中正确使用 retryWhen 运算符
correct use of retryWhen operator with RxSwift 4.0.0
在 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 的扩展,但我遇到了一些编译错误。
我认为这与 RxSwift
无关,而是 Moya
的变化。 MoyaProvider.rx.request
returns Single
这是 PrimitiveSequence
的类型别名,它不是 ObservableType
.
您在 ObservableType
上声明您的函数。
所以在retryWithToken()
之前做asObservable()
在 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 的扩展,但我遇到了一些编译错误。
我认为这与 RxSwift
无关,而是 Moya
的变化。 MoyaProvider.rx.request
returns Single
这是 PrimitiveSequence
的类型别名,它不是 ObservableType
.
您在 ObservableType
上声明您的函数。
所以在retryWithToken()
asObservable()