2016-08-18 3 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 

Так как я должен делать это? Любой должен использовать примеры?

UPD

Я хочу поставить любое условие, я хочу внутри если \ еще блок.

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

не только нулевой или нулевой. Например, я могу сказать,

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

ответ

1

Это так просто, как:

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

Это не подпишется на networkObservable исключением случаев, когда ваша databaseObservable завершается без onNext.

+0

но где is if \ else? Я думаю, что моя база данных будет продолжена в любом случае, дело в том, что она может вернуть список с нулевыми элементами. –

+0

Нет необходимости в том, чтобы/else то, что он делает: подписаться на databaseObservable до тех пор, пока он не завершится (потому что concat) – 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