可能有更好的方法,但是您可以为每个事件附加一个发射时间戳,确定其中哪个是最后一个,然后发射其余的。通过它们来自的可观察对象(字段)来识别这些事件,并根据列表中缺少的元素来决定。
mObservableEditTextA = RxTextView.textChanges(mEditTextA)
.debounce(500, TimeUnit.MILLISECONDS) // So we don't flood the heap with lots of object construction, creating performance overhead due to garbage collection
.map(text -> Pair.create(new Date(), text));
mObservableEditTextB = RxTextView.textChanges(mEditTextB)
.debounce(500, TimeUnit.MILLISECONDS)
.map(text -> Pair.create(new Date(), text));
mObservableEditTextC = RxTextView.textChanges(mEditTextC)
.debounce(500, TimeUnit.MILLISECONDS)
.map(text -> Pair.create(new Date(), text));
Observable.combineLatest(mObservableEditTextA, mObservableEditTextB, mObservableEditTextC, (fieldAPair, fieldBPair, fieldCPair) -> {
firstField = ...;
secondField = ...;
// from timestamps determine which of the fields emitted last and return the other two with identifiers
return Arrays.asList(Pair.create(firstFieldIdentifier, firstField), Pair.create(secondFieldIdentifier, secondField));
})
.subscribe(result -> {
/* result is always a list of 2 items, more specifically
pairs of an identification in first position and new text
in the second.
Here you can look for the missing field in the list and
compute it from the other two */
})
确定要计算哪一个的逻辑在这里重复。我这样做只是因为不必将这些对象包装在一个新对象中,并且嵌套的 Pairs 失去了可读性。
但是,您可以将列表中的位置视为字段的标识符,尽管这很容易出错。
这些方法中的任何一种都会将确定逻辑从订阅者和 combineLatest 运算符仅移动到订阅者本身。你的来电。