正确使用retryWhen运算符使用RxSwift 4.0.0

时间:2018-02-01 08:22:36

标签: rx-swift moya

使用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序列期望a     PrimitiveSequence<SingleTrait, Response>

有人可以向我解释如何使用RxSwift 4.0.0做同样的事情吗?我尝试使用PrimitiveSequence的扩展,但我有一些编译错误。

1 个答案:

答案 0 :(得分:3)

我认为这与RxSwift无关,而是Moya更改。 MoyaProvider.rx.request会返回SinglePrimitiveSequence这是ObservableType的{​​{1}}的类型。

您在ObservableType上声明了您的功能。

所以只需在asObservable()

之前retryWithToken()