RxAlamofire:retryWhen 掉入订阅块

Posted

技术标签:

【中文标题】RxAlamofire:retryWhen 掉入订阅块【英文标题】:RxAlamofire: retryWhen drops into subscribe block 【发布时间】:2017-02-16 10:49:56 【问题描述】:

我正在尝试使用最大重试次数来实现 alamofire 调用。代码如下:

RxAlamofire.request(.post, URL, parameters: parameters, encoding: JSONEncoding.default)
    .observeOn(MainScheduler.instance)
    .retryWhen  (errors: Observable<Error>) in
        return errors.flatMapWithIndex  (e, a) -> Observable<Int64> in
            if a >= self.RETRY_COUNT - 1 
                return Observable.error(e)
            
            print("Error: delay server call retry by \(a+1) second(s)")
            return Observable<Int64>.timer(RxTimeInterval(a+1), scheduler: MainScheduler.instance)
        
    
    .subscribe(
        onNext: 
            (result) in

            print("I get here when retrying...")
        ,
        onError:  (error) in
            print(error)
        
    )
    .addDisposableTo(self.disposeBag)

不幸的是,在重试时,我进入了订阅中的 onNext 块 - 在我得到结果之前我不想到达那里。 (按预期超出最大重试次数后,onError 会出错)。请问有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

我已尝试重现您的场景,但以下代码在出错时不会触发订阅中的 onNext 闭包。 我稍微重写了你的代码,我的例子总是出错。我正在使用 RxSwift 4.0.0。

let count = 2

enum MyError: Error 
    case crash


_ = Observable<Int>.error(MyError.crash)
    .debug("prior")
    .retryWhen  errors in
        return errors.enumerated().flatMap  (index, error) -> Observable<Void> in
            guard index < count - 1 else  return .error(error) 

            print("Error: delay server call retry by \(index + 1) second(s)")
            return Observable<Void>.just(()).delay(RxTimeInterval(index + 1), scheduler: MainScheduler.instance)
        
    
    .debug("after")
    .subscribe(onNext:  element in
        print("got next element: \(element)")
    )

这会产生以下输出。

2018-03-16 09:05:16.921: after -> subscribed 2018-03-16 09:05:16.924: prior -> subscribed 2018-03-16 09:05:16.924: prior -> Event error(blok) Error: delay server call retry by 1 second(s) 2018-03-16 09:05:16.925: prior -> isDisposed 2018-03-16 09:05:17.926: prior -> subscribed 2018-03-16 09:05:17.926: prior -> Event error(blok) 2018-03-16 09:05:17.927: after -> Event error(blok) 2018-03-16 09:05:17.928: after -> isDisposed 2018-03-16 09:05:17.928: prior -> isDisposed

【讨论】:

以上是关于RxAlamofire:retryWhen 掉入订阅块的主要内容,如果未能解决你的问题,请参考以下文章

RxAlamofire - 如何获得错误响应?

RxJava操作符repeatWhen()和retryWhen()

RxAlamofire - 下载完成的事件丢失

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

RxAlamofire 扩展在一处处理错误

如何使用 RxAlamofire 下载图像