2016-11-04 31 views
3

我有兩個ObservablesobservableDisconnectContact負責調用刪除聯繫人的API請求並正常工作。如果聯繫人已從數據庫中刪除,則第二個observableDeleteContact會發出真或假。我使用greeDaoRxJava結合布爾運算符

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

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

我想結合兩者,但第二個observable應該在第一個完成時啓動並返回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的結果。如果observableDisconnectContact發射true和過濾器(未發射任何東西),如果它是false

+0

這幾乎是很好。如果'observableDisconnectContact'發出false,它就被稱爲'onComplited()'。是否有可能發佈虛假? – Michael

+0

@邁克爾是可能的,請檢查我的答案 –