为什么我不能在 .onError() 之后保持 observable 存活,即使我已经使用了像 .catchError() onRxSwift 这样的错误处理?
why I can't keep observable alive after .onError() even I already use error handling like .catchError() onRxSwift?
所以,即使在输入 onError()
之后,我也想保持 observable keep alive(不丢弃),所以我可以输入 onNext()
我已经关注了
通过添加 .catchError()
或 .catchErrorReturn()
但它没有像我预期的那样工作
(注意:我 运行 操场上的这段代码)
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data.debug("debug").flatMap({
[=10=].map({data in
return data
}).catchError({err in
return Observable.empty()
})
}).subscribe(onNext:{
print([=10=])
},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.
[压力是我的]
正如我在评论中提到的:That observable 将不再能够发出任何内容,并且将处理掉对它的任何订阅。但是,它的唯一订阅来自 flatMap 内部。您的数据主体仍将能够发射更多。
例如:
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data
.debug("debug")
.flatMap {
[=10=].catchError { _ in Observable.empty() }
}
.subscribe(
onNext: { print([=10=]) },
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
为了获得最佳解决方案,我建议使用 materialize()
和 compactMap
。
看看 https://michaellong.medium.com/rxswift-better-error-handling-with-compactmap-48a5d314d0f1
所以,即使在输入 onError()
之后,我也想保持 observable keep alive(不丢弃),所以我可以输入 onNext()
我已经关注了
通过添加 .catchError()
或 .catchErrorReturn()
但它没有像我预期的那样工作
(注意:我 运行 操场上的这段代码)
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data.debug("debug").flatMap({
[=10=].map({data in
return data
}).catchError({err in
return Observable.empty()
})
}).subscribe(onNext:{
print([=10=])
},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.
[压力是我的]
正如我在评论中提到的:That observable 将不再能够发出任何内容,并且将处理掉对它的任何订阅。但是,它的唯一订阅来自 flatMap 内部。您的数据主体仍将能够发射更多。
例如:
let bag = DisposeBag()
let data = PublishSubject<Observable<Int>>()
data
.debug("debug")
.flatMap {
[=10=].catchError { _ in Observable.empty() }
}
.subscribe(
onNext: { print([=10=]) },
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
为了获得最佳解决方案,我建议使用 materialize()
和 compactMap
。
看看 https://michaellong.medium.com/rxswift-better-error-handling-with-compactmap-48a5d314d0f1