ReactiveX RxSwift 从可观察对象的连接中获得第一个非错误

ReactiveX RxSwift get first non error from concat of observables

我在我的 iOS 应用程序中使用 RxSwift 进行缓存,并且有一段代码如下:

let observable = Observable.of(cache.getItem(itemID), network.getItem(itemID)).concat().take(1)

observable.subscribeNext // and do some stuff

我有 cache.getItem 方法执行 onError 如果它没有价值,并且希望它随后服从网络,但由于某种原因网络永远不会 运行.我假设它是因为我正在使用 take(1),但我希望一旦缓存找到某些东西,observable 就停止发射(或者如果没有找到,则继续到网络)。

关于如何做到这一点有什么想法吗?

我一直在关注 this 指南,但他没有详细说明缓存在找不到内容时的行为。

你不应该那样使用 .Error。这在概念上并不是真正的错误案例。缓存中什么也没有。这是很常见的情况。没有任何异常 "wrong"。相反,只需发送一个 .Completed 事件。

至于为什么你的代码不工作,这是因为来自 concat 中包含的 Observable 的错误将成为最终 concat [=13] 的错误=]. Rx 要记住的是,一旦有 .Completed 事件或(在你的情况下).Error 事件,就是这样,结束了,不再有 .Next 事件(或任何事件)。

因此,如果您使用 .Completed,您的代码将这样工作:

class Cache {
    func getItem(itemID: Int) -> Observable<Item> {
        return Observable<Item>.create { observer in
            // if not found...
            observer.onCompleted() // you would of course really try to get it
                                   // from the cache first.
            return NopDisposable.instance
        }
    }
}

class Network {
    func getItemN(itemID: Int) -> Observable<Item> {
        return Observable<Item>.create { observer in
            // get some `item` from the network and then..
            observer.onNext(item)
            return NopDisposable.instance
        }
    }
}

let observable = Observable.of(cache.getItem(itemID), network.getItem(itemID)).concat().take(1)

observable.subscribeNext { item in
    print(item)
}