为什么我不能在 .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