所以,即使在输入 onError()
之后,我也想保持 observable keep alive(不丢弃),所以我可以输入 onNext()
我已经关注this answer
通过添加 .catchError()
或 .catchErrorReturn()
但它没有像我预期的那样工作
(注意:我在 Playground 上运行这段代码)
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data.debug("debug").flatMap({
$0.map({data in
return data
}).catchError({err in
return Observable.empty()
})
}).subscribe(onNext:{
print($0)
},onCompleted:{
print("end")
}).disposed(by: bag)
let inputData = PublishSubject<Int>()
data.onNext(inputData)
inputData.onNext(1)
inputData.onNext(2)
inputData.onError(MyError.anError)
inputData.onNext(2)
我得到的实际结果
1
2
我想要的预期结果
1
2
2
最佳答案
一旦你将错误推送到你的 inputData
中,它就完成了,将不再发出任何东西。 (句号)那是 Observable 契约,从不同的 Observable 捕获错误并不会改变这一点。
了解有关 Observable Contract 的更多信息其中一部分说:
Upon issuing an OnCompleted or OnError notification, it may not thereafter issue any further notifications.
[压力是我的]
正如我在评论中提到的:那个 observable 将不再能够发出任何东西,并且它的任何订阅都将被处理掉。但是,它的唯一订阅来自 flatMap 内部。您的数据主体仍将能够发射更多。
例如:
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data
.debug("debug")
.flatMap {
$0.catchError { _ in Observable.empty() }
}
.subscribe(
onNext: { print($0) },
onCompleted: { print("end") }
)
.disposed(by: bag)
let inputData1 = PublishSubject<Int>()
data.onNext(inputData1)
inputData1.onNext(1)
inputData1.onNext(2)
inputData1.onError(MyError.anError)
let inputData2 = PublishSubject<Int>()
data.onNext(inputData2)
inputData2.onNext(2)
将打印出:
debug -> subscribed
debug -> Event next(RxSwift.PublishSubject<Swift.Int>)
1
2
debug -> Event next(RxSwift.PublishSubject<Swift.Int>)
2
关于swift - 为什么我不能在 .onError() 之后保持 observable 存活,即使我已经使用了像 .catchError() onRxSwift 这样的错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56804308/