2016-08-18 11 views
0

良いチェーンを作成しようとしています。私はこの質問が人気であり、尋ねられたと思うが、私はそれを見つけられていない。データベースとサーバーへのRxJavaチェーン

だから、私が望むのはデータベースに行くことです。その中に何かがなければ、サーバーから情報をダウンロードします。ここで

はコードです:

() -> loadPriceListFromDatabase.call(null) 
         .flatMap(mealTypes -> { 
          if (mealTypes.size() != 0) { 
           return Observable.just(mealTypes); //here is the place where I'm not sure about code style. 
          } 
          return loadPriceList.call(null) 
            .map(model -> { 
             preferences.setPriceListDate(model.getDate().getTime()); 
             return ActiveAndroidHelper.saveMeals(model); 
            }); 
         }) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()), 
       MainActivity::onTestLoaded, 
       BaseActivity::onError 

だから私はこれをどのようにしたらよいでしょうか? の例を使用する必要がありますか?

私は内部\ elseブロックであれば好きな条件を入れたい

UPD。

if (mealTypes.size() != 0) { 

何かがnullでもゼロでもない。 たとえば、私はあなたに観察が自動的にパイプラインで新しいものを提供することができ、空である場合には

if (date == currentDate) { (//where date is timestamp 

答えて

1

をチェックそれは同じくらい簡単です:それがない限りnetworkObservableに加入しません

Observable.concat(
    databaseObservable.filter(databaseItem -> databaseItem.date ==  currentDate) , 
    networkObservable 
).take(1).subscribe(...) 

databaseObservableはonNextなしで完了します。

+0

ただし、if \ elseはどこですか?私のデータベースはどちらの場合でも継続すると思いますが、それはゼロ要素でリストを返すことができるということです。 –

+0

それは何かする必要はありません:完了するまで(concatのため)データベースObservableを購読します – CristianGM

+0

データベースの完成後、ネットワークのために行くが、take(1)データベースコールonNextはネットワークを呼び出す前に終了します。 databaseObservableがObservable.empty()を返すと、networkObservableをサブスクライブします。 – CristianGM

0

使用swtichIfEmptyオペレータが、言うことができます。

チェックこの例

@Test 
public void testSwitchPerson() { 
    Observable.just(new ArrayList<>()) 
       .flatMap(persons -> Observable.from(persons) 
              .switchIfEmpty(Observable.just(new Person("new", 0, "no_sex")))) 
       .subscribe(System.out::println); 

} 

あなたはより実用的な例を参照したい場合はhttps://github.com/politrons/reactiveにここ

関連する問題