2016-04-03 10 views
3

私はAndroidのRxJavaでリポジトリパターンのようなものを実現するためのより良い方法を見つけようとしています。ここでRxJavaでリポジトリパターンを実装する

は、私がこれまで持っているものだ。それはネットワーク要求を作ってあげるいない場合は、保存されたキャッシュされたデータがあるかどう基本的にはチェック

public Subscription getData(Observer<Data> observer, boolean refresh) { 
    Subscription sub = null; 

    Data cached = getCachedData(); 
    if(cached != null) { 
     observer.onNext(cached); 
     if(refresh) { 
      sub = requestNetwork().subscribe(observer); 
     } else { 
      observer.onCompleted(); 
     } 
    } else { 
     sub = requestNetwork().subscribe(observer); 
    } 

    return sub; 
} 

を(hereからいくつかのコードを取りました)。また、それは常にネットワーク要求を行うrefreshブールパラメータ強制している。

この関数の呼び出し元は、Observableの代わりにSubscriptionを受け取る必要があります。これはもはやチェーンできません。

ファンクションをObservableに戻す方法はありますか?まだリポジトリパターンがありますか?

+1

ああ、私一度http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/ – akarnokd

+0

を参照してください。その記事を開きましたが、それを使用しなかったのは、サブスクライバーが述部に一致する最初のソースから取得しただけの「first」を使用したためです。 'refresh'パラメータを利用して' first'演算子を呼び出すには** not **を選択できます。ありがとう! –

答えて

1

akarnokdがDan Lewのthis articleに私を指摘してくれてありがとう。

私の最終的なコード:

public Observable<Data> getData(boolean refresh) { 
    Observable<Data> obs = Observable.concat(getCache(), requestNetwork()); 
    if(!refresh) { 
     obs = obs.first(data -> data != null); 
    } 
    return obs; 
} 
+0

しかし、これはキャッシュにアイテムがあり、リフレッシュがtrueのときに2つのアイテムを放出します。 –

+0

@ TassosBassoukos私はそれが私が望むもののようなものだと思います。ビューはアイテムを2回受信します。最初に、キャッシュはネットワークから新しいものを再びレンダリングします。 –

関連する問題