在 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&lt;SingleTrait, Response&gt;

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

【问题讨论】:

【参考方案1】:

我相信这与RxSwift 无关,而是Moya 的变化。 MoyaProvider.rx.request 返回 Single,这是 PrimitiveSequence 的类型别名,而不是 ObservableType

你在ObservableType上声明你的函数。

所以在retryWithToken()之前做asObservable()

【讨论】:

以上是关于在 RxSwift 4.0.0 中正确使用 retryWhen 运算符的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 正确使用变量

正确使用 RxSwift 和 TableView

如何正确安装“RxSwift”模块?

如何将多个驱动程序与 RxSwift 正确组合?

如何正确地将 3rd 方库委托转换为 RxSwift Observable

使用 RxSwift 异步加载 UITableView 单元格