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)
}
我在我的 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)
}