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