Search code examples
rx-swiftmoya

correct use of retryWhen operator with RxSwift 4.0.0


with RxSwift 3.6.1 I made this extension to ObservableType to get a new token after an error request:

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)
            })
        }
    }
}

and then I can use it:

Session.shared.myProvider.rx
    .request(.mySampleRequest)
    .filterSuccessfulStatusCodes()
    .retryWithToken()
    .subscribe { event in
        ....
    }.disposed(by: self.disposeBag)

but with RxSwift 4.0.0 now the sequence expect a PrimitiveSequence<SingleTrait, Response>

someone can explain to me how to do the same with RxSwift 4.0.0? I try with an extension to PrimitiveSequence but I've some compilation errors.


Solution

  • I believe that has nothing to do with RxSwift but is a Moya change. MoyaProvider.rx.request returns Single which is a typealias for PrimitiveSequence which is not an ObservableType.

    You declare your function upon the ObservableType.

    So just do asObservable() before retryWithToken()