错误后重新订阅 Observable
Re-subscribing to an Observable after error
我觉得我开始掌握 RxSwift 的窍门了——但是我遇到了障碍。
这是我为演示构建的对象(在发布到 SO 之前我已经简化了它)。我的问题是,当上传过程中出现网络错误时,所有订阅都会被处理掉。所以当我再次点击 rightBarButtonItem
时,没有任何反应。
correct/better 建模的方法是什么?我不确定我是否正确掌握了 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 { [=10=].1 }
.debug("Upload Progress")
.bindTo(rx_progress)
.addDisposableTo(disposeBag)
upload
.filter { [=10=].0 != nil }
.map { Post(jsonData: [=10=].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)
这里有2个选项:
防止因 Error
事件而处理 observables。
您可以使用 catchError
family.
来做到这一点
立即使用retry
家庭重新订阅。
根据您编写代码的方式,我认为不需要示例代码:D
但是,请注意,如果 Subject
收到 Error
或 Completed
事件,它将不再发送任何进一步的事件。
我觉得我开始掌握 RxSwift 的窍门了——但是我遇到了障碍。
这是我为演示构建的对象(在发布到 SO 之前我已经简化了它)。我的问题是,当上传过程中出现网络错误时,所有订阅都会被处理掉。所以当我再次点击 rightBarButtonItem
时,没有任何反应。
correct/better 建模的方法是什么?我不确定我是否正确掌握了 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 { [=10=].1 }
.debug("Upload Progress")
.bindTo(rx_progress)
.addDisposableTo(disposeBag)
upload
.filter { [=10=].0 != nil }
.map { Post(jsonData: [=10=].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)
这里有2个选项:
防止因
Error
事件而处理 observables。
您可以使用catchError
family. 来做到这一点
立即使用
retry
家庭重新订阅。
根据您编写代码的方式,我认为不需要示例代码:D
但是,请注意,如果 Subject
收到 Error
或 Completed
事件,它将不再发送任何进一步的事件。