一旦网络在 RxSwift 中断开,再次触发 api
Posted
技术标签:
【中文标题】一旦网络在 RxSwift 中断开,再次触发 api【英文标题】:trigger an api again once network goes off in RxSwift 【发布时间】:2021-08-04 10:10:49 【问题描述】:下面是我的代码。我需要多次调用 api 直到有网络信号。
buttonAction.do(onNext: [weak self] in
self?.activity.startAnimating()
apiManager.callApi()
.do(onNext: [weak self] in
self?.activity.stopAnimating()
,onError: [weak self ] error in
if let error = error as? NoNetwork
self?.activity.stopAnimating(errorInfo:error,presentationStyle:.alert)
// here alert will be appear. On click ok button, need to trigger the API() again
)
.subscribe().disposed(by:bag)
【问题讨论】:
【参考方案1】:请注意,您没有说明要如何处理任何其他类型的错误,因此下面的代码将忽略它们...如果您想显示所有错误的警报,请删除 filter
。
let error = PublishSubject<Error>()
let retry = error
.filter $0 is NoNetwork
.map $0.localizedDescription
.flatMapFirst(presentScene(animated: true, scene: message in
UIAlertController(title: "Error", message: message, preferredStyle: .alert)
.scene $0.connectOK()
))
.share()
Observable.merge(buttonAction, retry)
.subscribe(onNext: [activity] in
activity.startAnimating()
)
.disposed(by: bag)
Observable.merge(buttonAction, retry)
.flatMapFirst
apiManager.callApi()
.catch error.onNext($0); return .just(())
.subscribe(onNext: [activity] in
activity.stopAnimating()
)
.disposed(by: bag)
presentScene
函数来自我的CLE library。在此代码中,activity
是标准的 UIActivityIndicatorView
,而不是您使用的任何代码。
【讨论】:
Observable.merge(buttonAction, retry) 重复两次。我们可以一口气完成吗? 您可以先使用let trigger = Observable.merge(buttonAction, retry)
,然后在这两个地方使用trigger
,但这种“DRY in the small”是一种不必要的间接级别,只会混淆 IMO 代码。跨度>
以上是关于一旦网络在 RxSwift 中断开,再次触发 api的主要内容,如果未能解决你的问题,请参考以下文章
Socket.io断开事件错误地为其他用户触发,然后再次连接
iOS RxSwift - 如何“断开”一个 observable?