最终,我需要一种方法来捕获RXSwift错误而又不向流中发送其他项,这对于当前的RX运算符来说似乎是不可能的。
这是我的应用程序现在的工作方式:
我有3层:
服务层充当本地层和远程层之间的桥梁,并由UI代码直接调用。
对于服务层中提供的每个功能,例如getData() -> Observable<String>
我需要执行以下操作:
我已经在操场上走了这么远
本地数据服务:
let localService = Observable<String>.create { (observer) -> Disposable in
observer.onNext("Local result")
observer.onCompleted()
return Disposables.create()
}.observeOn(MainScheduler.instance)
远程数据服务:
let remoteService = Observable<String>.create { (observer) -> Disposable in
observer.onNext("Remote result")
observer.onCompleted()
return Disposables.create()
}.observeOn(MainScheduler.instance).delay(5, scheduler: MainScheduler.instance)
数据库更新程序服务:
let databaseUpdaterService = Observable<Void>.empty().observeOn(MainScheduler.instance).delay(2, scheduler: MainScheduler.instance)
let remoteAndDatabaseService = remoteService.do(onNext: { (value) in
print("Database updating")
_ = databaseUpdaterService.subscribe(onCompleted: {
print("Database updated")
})
})
时间行情记录:
let ticker = Observable<Int>.interval(1, scheduler: MainScheduler.instance).do(onNext: { (tick) in
print("Ticker event: \(tick) seconds")
}).takeUntil(remoteService)
合并的服务:
let mergedService = Observable<String>.merge([localService, remoteAndDatabaseService])
启动股票行情
print("Ticker start")
_ = ticker.subscribe(onError: { (error) in
print("Ticker error")
}, onCompleted: {
print("Ticker completed")
}, onDisposed: {
print("Ticker disposed")
})
启动服务:
print("Service start")
_ = mergedService.subscribe(onNext: { (value) in
print("Service value: \(value)")
}, onError: { (error) in
print(error.localizedDescription)
}, onCompleted: {
print("Service completed")
}, onDisposed: {
print("Service disposed")
})
对于幸福的道路,这是完美的方法。
但是,在localService调用onError
的情况下(例如,如果本地对象不存在),合并的流终止。
我希望错误被淹没,而localService的流也不会发出任何错误。
当前catch
运算符迫使您发射另一个对象,而不是无声地失败。
预先感谢您的帮助。
答案 0 :(得分:0)
没关系,
类似RxSwiftExt的方法适用于我的用例:catchErrorJustComplete() -> Observable<E>
答案 1 :(得分:0)
如果您不想只引入整个RxSwiftExt库,则可以使用.catchError { _ in Observable.empty() }
来处理错误并发出完整事件。
另一个选择是.catchError { _ in Observable.never() }
,它将吞噬错误,但不发出任何消息。