2016-07-19 6 views
1

の連結から最初の非エラーを取得すると、このようなコードの部分を持っています何の価値もなく、ネットワークに延期することを望みますが、なんらかの理由でネットワークが決して実行されません。私はtake(1)を使用しているので、私は仮定しますが、キャッシュが何かを見つけたら、observableの発光が止まるようにしたいと思います(そうでなければ観測を続けます)。ReactiveX RxSwiftは、私は私のiOSアプリでキャッシュにRxSwiftを使用しています観測

これを行う方法に関するアイデアはありますか?

私は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

関連する問題