2017-07-26 3 views
5

でCompletableは、私のような新しいRxJava Sourcesに非常に興奮しています:クリーナー、インターフェイスクラスを作成し、あなたの「ソース」の作成中に多くのミスを防ぐSingleMaybeCompletable、 (例えば、を呼ぶのを忘れる)rxJava2、たぶん、複雑なストリーム

しかし、複雑なストリームにそれらを結合するには、多くの定型文が必要です。

など。我々はデータの読み込みとキャッシュの一般的なAndroidの状況があります。我々は2元apicacheを持っているし、我々はそれを組み合わせるしたいと仮定しましょう:

public interface Api { 
    Single<Integer> loadFromNetwork(); 
} 

public interface Cache { 
    Maybe<Integer> loadFromCache(); //maybe because cache might not have item. 
} 

はのは、それを組み合わせるしてみましょう:

final Single<Integer> result = cache.loadFromCache() 
     .switchIfEmpty(api.loadFromNetwork()); 

Maybeが過負荷Maybe.switchIfEmpty(Single):Singleを持っていないので、それは、コンパイルされません

ので、我々はすべてのものに変換する必要があります。

final Single<Integer> result = cache.loadFromCache() 
     .switchIfEmpty(api.loadFromNetwork().toMaybe()) 
     .toSingle(); 

それを組み合わせるための別の可能な方法もсonversionが必要です。

final Single<Integer> result = Observable.concat(
      cache.loadFromCache().toObservable(), 
      api.loadFromNetwork().toObservable() 
     ).firstOrError(); 

だから私は、コードのノイズを追加し、余分なオブジェクトの多くを作成し、多くの変換せずに新しいソースを使用する方法が表示されません。

このような問題のため、私はSingle,MaybeCompletableを使用できず、引き続きObservableを使用しています。

だから私の質問は次のとおりです。

  • SingleMaybeCompletableを組み合わせるのベストプラクティスは何ですか。

  • なぜこれらのソースにはコーミングを簡単にするためのオーバーロードがないのですか?

  • なぜこれらのソースに共通の祖先がなく、
    のパラメータがswitchIfEmptyと他の方法で使用されているのですか?


P.S.誰もこれらのクラスに共通の階層がない理由を知っていますか?
私は、Completableのコードでも動作するコードがあれば、SingleMaybeで正常に動作しますか?

+0

ベストプラクティスを除いて、[this](https://stackoverflow.com/a/43890691/6774854)はすべてをカバーしていると思います。おそらく 'switchIfEmptySingle'のようなメソッドが必要な場合は、それを求めることができます。 – masp

+0

アイテムをキャッシュで使用できず、ネットワークからアイテムをロードするときに、ネットワークコールによってキャッシュされたデータも更新したいですか? 私が言っていることは、なぜ2つを組み合わせたいと思うかということです。例えば、あなたがキャッシュストレージとルームデータベースを持っていて、 'Flowable'を持つテーブルを見ているとします。このストリームは、あなたのクエリに特有のものがなければ出ません。同時にリクエストを送信し、返されたデータがあり、それをあなたのテーブルに置くと、それが異なっている場合、 'Flowable'が放出されます。 – arubin

答えて

0

たぶん私は包括的な答えではないのですが、私はあなたの特定のユースケースに答えるようにしてみてください。

私はあなたの組み合わせタスクの目的は、結果では、リモート呼び出したい空の場合は、キャッシュからデータを取得することだと思いますapi:

final Single<List<Integer>> single = api.call(); 
    Maybe<List<Integer>> maybe = disk.call(); 


    Single <List<Integer>> composedSingle = maybe.flatMapSingle(new Function<List<Integer>, SingleSource<?>>() { 
     @Override 
     public SingleSource<?> apply(List<Integer> integers) throws Exception { 
      if(integers.isEmpty()) return single; 
      else return Single.just(integers); 
     } 
    }); 

私はそれをテストしていませんが、私は考えられる解決策である可能性があります。

+1

放射を伴わずに単に完了すれば、 'flatMapSingle'は例外をスローします。 – masp

+0

はい、そうです。だから私は提案されたソリューションと答えをすべて削除する必要がありますか? – Fabio

+0

提案されたコードには別の問題があります。空リストは、サーバーからの空の応答を正しくキャッシュすることを許可していないため、そのような項目がキャッシュに存在しないことを示す最善の方法ではありません。 –