RXSwift:在不从流中发出元素的情况下捕获错误

时间:2018-11-29 13:45:17

标签: rx-swift

最终,我需要一种方法来捕获RXSwift错误而又不向流中发送其他项,这对于当前的RX运算符来说似乎是不可能的。

这是我的应用程序现在的工作方式:

我有3层:

  • 服务层
  • 本地数据层
  • 远程数据层

服务层充当本地层和远程层之间的桥梁,并由UI代码直接调用。

对于服务层中提供的每个功能,例如getData() -> Observable<String>我需要执行以下操作:

  • 获取本地数据并启动每秒从0向上计数的代码
  • 从远程服务获取数据
  • 自动收录器应仅在远程服务完成时完成
  • 如果本地服务返回错误,则必须将其忽略并且不发出
  • 远程服务完成后,请使用新数据更新本地数据(如果有的话)

我已经在操场上走了这么远

本地数据服务:

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运算符迫使您发射另一个对象,而不是无声地失败。

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

没关系,

类似RxSwiftExt的方法适用于我的用例:catchErrorJustComplete() -> Observable<E>

答案 1 :(得分:0)

如果您不想只引入整个RxSwiftExt库,则可以使用.catchError { _ in Observable.empty() }来处理错误并发出完整事件。

另一个选择是.catchError { _ in Observable.never() },它将吞噬错误,但不发出任何消息。