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

标签 swift rx-swift

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

相关文章:

swift - 使用 RxSwift 扩展目标- Action 方法

ios - RxSwift 过滤器变量数组

swift - UICollectionView 未在 UITableViewCell 内部更新

ios - 使用 RxSwift 的 TabelView 委托(delegate)方法

Swift 使 UIView 边框变成渐变色

ios - 在 SwiftUI 中暂停通知发布者

swift - RxSwift 观察模型的变化并发出请求

swift3 - 如何过滤 Observable 元素的数组 | RxSwift

ios - Swift - UIView 包含 UIImageView 包含图像

ios - Swift:无法使用 Firebase 将数据同步到 TableView