ReactiveX RxSwift从可观察的concat中获得第一个非错误

时间:2016-07-19 23:49:02

标签: ios swift system.reactive reactive-programming rx-swift

我在我的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指南,但他没有详细了解缓存在找不到内容时的行为。

1 个答案:

答案 0 :(得分:2)

您不应该像这样使用.Error。这在概念上并不是一个错误案例。缓存中没有任何内容。这是一种常见的情况。没有什么比“与众不同”了。相反,只需发送一个.Completed事件。

至于您的代码无效的原因,是因为Observable中包含的concat错误会导致最终concat Observable错误。要记住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)
}