2016-11-04 5 views
3

У меня есть два Observables. observableDisconnectContact отвечает за вызов API для удаления контакта, и он работает правильно. Второй observableDeleteContact испускает true или false, если контакт удален из базы данных. Я использую greeDao.Комбинация RxJava с булевыми операторами

Observable<Boolean> observableDisconnectContact = apiClient.observableDisconnectContact(contactModel.getId()) 

Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId()) 

Я хочу комбинировать оба, но второй наблюдаемый должен начинаться, когда первый делается и возвращает true. Я думаю об использовании concat() и first(). Но я должен знать, что результат испускания потока истинен. Поэтому я использую combineLatest() или zip(). Но это нехорошо, потому что оба потока работают в одно и то же время. Я заметил, что оператор first() не работает для zip() и combineLatest().

Как я могу объединить оба Observables, где второй начался после того, как первый поток есть или нет, если первый возвращает false, а результат обоих потоков должен быть как один результат.

Observable.combineLatest(observableDisconnectContact, observableDeleteContact, new Func2<Boolean, Boolean, Boolean>() { 
      @Override 
      public Boolean call(Boolean isDisconnectSuccess, Boolean isRemoveSuccess) { 
       return isDisconnectSuccess && isRemoveFromDatabaseSuccess; 
      } 
     }).subscribe(new Subscriber<Boolean>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onNext(Boolean isDeleted) { 
       if (isDeleted) { 
        //TODO 
       } 
      } 
     }); 

ответ

4
observableDisconnectContact 
     .flatMap(isDisconnectSuccessful -> { 
      if(isDisconnectSuccessful) return observableDeleteContact; 
      else return Observable.just(false); 
     }) 
     .subscribe(isBothActionsSuccessful -> { 
      if(isBothActionsSuccessful) { 
       //success! 
      } else { 
       //something goes wrong 
      } 
     }); 
1
observableDisconnectContact 
    .filter(new Func1<Boolean, Boolean>() { 
     @Override 
     public Boolean call(Boolean aBoolean) { 
      return aBoolean; 
     } 
    }) 
    .flatMap(new Func1<Object, Observable<Boolean>>() { 
     @Override 
     public Observable<Boolean> call(Object o) { 
      return observableDeleteContact; 
     } 
    }); 

Привели Наблюдаемое будет излучать observableDeleteContact «ы результат, если излучаемый observableDisconnectContacttrue и фильтр (не излучающие ничего), если он был false

+0

Это почти хорошо. Если 'observableDisconnectContact' испускает false, он вызывается просто' onComplited() '. Можно ли испускать ложь? – Michael

+0

@ Майкл можно, пожалуйста, проверьте мой ответ –

Смежные вопросы