RxSwift - 使用maxCount重试网络请求,直到成功

时间:2018-02-11 09:53:19

标签: swift rx-swift

如何使用maxCount(某种失败)重试网络请求,例如。 5次或直到服务器使用RxSwift的retry运算符返回我想要的东西。

我想要做的是:

  1. 当成功变为" ok"时,停止重试并立即发出queryedSuccess
  2. 当成功仍然是"失败"时,继续重试,直到maxCount达到5并发出queryedFail
  3. 从服务器返回的JSON结构如下所示:

    struct QueryAlipayOrderEnvelope {
        var success: String // "ok" or "fail"
        var tradeNumber: String
    }
    

    这是我尝试做的事情:

    struct ViewModel {
    
        var viewWillAppearTrigger = PublishSubject<Void>()
        var rechargeTrigger = PublishSubject<Void>()
        var outTradeNumber = PublishSubject<String>()
    
        var queryedSuccess: Driver<QueryAlipayOrderEnvelope>
        var queryedFail: Driver<QueryAlipayOrderEnvelope>
    
        let queryResult = self.outTradeNumber.asObservable()
            .flatMapLatest { tradeNum in
                AppEnvironment.current.apiService.queryAlipayOrder(outTradeNumber: tradeNum).materialize().debug("queryAlipayOrder", trimOutput: true)
            }
            .share(replay: 1)
            .retry(5)
    
        self.queryedSuccess = queryResult
            .elements()
            .skipWhile { $0.success != "ok" }
            .takeLast(1)
            .asDriver(onErrorDriveWith: .never())
            .debug("queryedSuccess", trimOutput: true)
    
        // this will emit when all 5 `success` are `fail`
        self.queryedFail = queryResult
            .elements()
            .takeLast(1)
            .filter { $0.success != "ok" }
            .asDriver(onErrorDriveWith: .never())
            .debug("queryedFail", trimOutput: true)
    }
    

    但是,请求只调用一次并在没有重试的情况下处理。

1 个答案:

答案 0 :(得分:0)

重试操作员响应onError通知。由于您在materialize()中使用flatMapLatest,因此您将Observable<Element>变为Observable<Event<Element>>,这意味着您收到的元素会告诉您这是一个错误事件而非接收onError通知。

尝试删除materialize()并查看是否有帮助。