2016-10-02 88 views
2

我是RxJava的新手,我一直在尋找一個正確的算子。 我想要有類似combineLatest的東西,但只在第一個Observable發出物品並從第二個Observable中取出最後一個物品時發出事件。 我目前這樣做使用BehaviourSubject,但我想避免有外部變量,如果有操作員做這樣的事情。RxJava算子,結合了兩個可觀測量並且僅在第一個可觀測量發射時發射

我現在擁有的一切:

 BehaviorSubject<Login> inputSubject = BehaviorSubject.create(); 
    Observable. 
      combineLatest(
        RxTextView.textChanges(inputEmail.getEditText()), 
        RxTextView.textChanges(inputPassword.getEditText()), 
        Login::new) 
      .subscribe(inputSubject); 
    return RxView.clicks(loginBtn).map(v -> inputSubject.getValue()); 

回答

0

你可以使用第二個combineLatest

Observable<Void> clicks = RxView.clicks(loginBtn); 
Observable<Login> loginData = ... 

class TaggedLogin { 
    Object tag; 
    Login data; 

    TaggedLogin(Object tag, Login data) { 
     this.tag = tag; 
     this.data = data; 
    } 
} 

return Observable.combineLatest(
    clicks.map(v -> new Object()), 
    loginData, 
    TaggedLogin::new 
).distinctUntilChanged(tl -> tl.tag).map(tl -> tl.data); 

與標籤的雜耍是必需的,因爲如果有任何新的價值combineLatest將發出。

如果你願意使用Experimental功能(又名RxJava可能會刪除或更改他們的未來),那麼以下是可能的:

Observable<Void> clicks = RxView.clicks(loginBtn); 
Observable<Login> loginData = ... 

return clicks.withLatestFrom(loginData, (v, data) -> data); 
+0

謝謝!真是愚蠢的我! – Heisenberg

0

你應該使用最後的算第二觀察到和使用的拉鍊把它們結合起來。

+0

但第二次觀察到的不調用的onComplete(),所以最後()運算符不會發出任何東西 – Heisenberg

+0

因此,您需要重新修改您的問題,正如您所說的「從第二個Observable中取出最後一個項目」。如果沒有onComplete調用,最後一項意味着什麼? – Snicolas

相關問題