gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 07:21:53 28 4
gpt4 key购买 nike

我在我的 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),但我希望一旦缓存找到某些东西,可观察对象就停止发射(如果没有找到,则继续到网络)。

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

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

最佳答案

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

至于为什么你的代码不工作,这是因为来自 concat 中包含的 Observable 的错误将成为最终 concat 的错误 可观察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 - ReactiveX RxSwift 从可观察对象的连接中获得第一个非错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38470277/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com