在 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()