gpt4 book ai didi

swift - 为什么我不能在 .onError() 之后保持 observable 存活,即使我已经使用了像 .catchError() onRxSwift 这样的错误处理?

转载 作者:行者123 更新时间:2023-11-28 05:40:52 25 4
gpt4 key购买 nike

所以,即使在输入 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/

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