gpt4 book ai didi

ios - 错误后重新订阅 Observable

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:48 24 4
gpt4 key购买 nike

我觉得我开始掌握 RxSwift 的诀窍了——然而我刚刚遇到了障碍。这是我为演示构建的对象(在发布到 SO 之前我已经简化了它)。我的问题是,当上传过程中出现网络错误时,所有订阅都会被处理掉。因此,当我再次点击 rightBarButtonItem 时,没有任何反应。

对此建模的正确/更好方法是什么?我不确定我是否正确掌握了 PublishSubject 的用法!

let activityIndicator = ActivityIndicator()
let disposeBag = DisposeBag()

let rx_upload = PublishSubject<Void>()
let rx_progress = PublishSubject<RxProgress>()
let rx_uploadComplete = PublishSubject<Look>()

override init() {
super.init()

activityIndicator
.drive(UIApplication.sharedApplication().rx_networkActivityIndicatorVisible)
.addDisposableTo(disposeBag)

let upload = rx_upload
.debug("Upload")
.flatMapLatest { [unowned self] -> Observable<(JSON?, RxProgress)> in
return self.upload()
}
.share()

upload
.map { $0.1 }
.debug("Upload Progress")
.bindTo(rx_progress)
.addDisposableTo(disposeBag)

upload
.filter { $0.0 != nil }
.map { Post(jsonData: $0.0!) }
.filterNil()
.debug("Upload Complete")
.bindTo(rx_uploadComplete)
.addDisposableTo(disposeBag)

}

func upload() -> Observable<(JSON?, RxProgress)> {
// ...
}

并且在 ViewController.swift...

self.navigationItem.rightBarButtonItem?.rx_tap
.bindTo(postUploader.rx_upload)
.addDisposableTo(disposeBag)

最佳答案

这里有两个选项:

  1. 防止因 Error 事件而处理 observables。
    您可以使用 catchError 系列来做到这一点。

  2. 使用retry 系列立即重新订阅。

根据您编写代码的方式,我认为不需要示例代码:D

但是,请注意,如果 Subject 收到 ErrorCompleted 事件,它将不再发送任何进一步的事件。

关于ios - 错误后重新订阅 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845892/

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