RxSwift 重试全链

Posted

技术标签:

【中文标题】RxSwift 重试全链【英文标题】:RxSwift retry full chain 【发布时间】:2018-06-13 18:03:16 【问题描述】:

我是 RxSwift 的新手,遇到以下问题。

给定两个函数:

struct Checkout  ... 

func getSessionIdOperation() -> Single<UUID>
func getCheckoutForSession(_ sessionId: UUID, asGuestUser: Bool) -> Single<Checkout>

我有第三个函数,它结合了两者的结果:

func getCheckout(asGuestUser: Bool) -> Single<Checkout> 
    return getSessionIdOperation()
        .map  ($0, asGuestUser) 
        .flatMap(getCheckoutForSession)

getSessionIdOperationgetCheckoutForSession都可能失败,如果失败,我只想重新启动整个链一次。我尝试了retry(2),但只是重复了getCheckoutForSession。 :(

【问题讨论】:

【参考方案1】:

确保retry(2)flatMap 一起直播

func getCheckout(asGuestUser: Bool) -> Single<Checkout> 
    return getSessionIdOperation()
        // .retry(2) will retry just first stream
        .map  ($0, asGuestUser) 
        .flatMap(getCheckoutForSession)
        .retry(2) // Here it will retry whole stream

如果getSessionIdOperation 失败,getCheckoutForSession 将永远不会被调用,因为它基于第一个流的输出。

【讨论】:

以上是关于RxSwift 重试全链的主要内容,如果未能解决你的问题,请参考以下文章

重试延迟 - RxSwift

RxSwift,分享+重试机制

Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求

RxSwift 更新身份验证令牌

Moya rxswift : 刷新令牌并重启请求

RxSwift安装