gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:46:56 26 4
gpt4 key购买 nike

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

我想做的是:

  1. 当成功变为“ok”时,停止重试并立即发出queryedSuccess
  2. 当成功仍为“失败”时,继续重试,直到 maxCount 达到 5 并发出 queryedFail

从服务器返回的 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)
}

但是,该请求仅调用一次并被处理,无需重试。

最佳答案

重试操作符响应 onError通知。因为您正在使用materialize()在你的flatMapLatest ,您正在转动您的Observable<Element>进入Observable<Event<Element>> ,这意味着您正在接收告诉您这是一个错误事件的元素,而不是接收 onError通知。

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

关于swift - RxSwift - 使用 maxCount 重试网络请求,直到成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com