我是RxJava
的新手,我很难找到合适的操作员。
我想要combineLatest
之类的东西,但只在第一个Observable
发出项目时从第二个Observable
中取出最后一个项目时发出事件。
我目前正在使用BehaviourSubject
这样做,但如果有运营商做这样的事情,我想避免使用外部变量。
我现在拥有的:
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 :(得分:0)
您应该使用第二个observable上的最后一个运算符并使用zip来组合它们。
答案 1 :(得分: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);