2016-07-19 37 views
1

的CONCAT获得第一个非错误和有这样的一段代码:ReactiveX RxSwift从我在我的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指南,但他没有详细介绍当缓存未能找到内容时缓存的行为。

回答

2

你不应该这样使用.Error。这在概念上并不是一个错误的例子。缓存中没有任何内容。这是常见的情况。没有什么比普通的做法“错”了。相反,只需发送一个.Completed事件。

至于为什么你的代码不能正常工作,这是因为从包含在concat一个Observable未来的错误将成为最终的concatObservable错误。与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) 
} 
+1

真棒,谢谢伙计!良好的解释和完美的作品 – Josh

+0

对,继续与Rx玩吧! – solidcell