combineLatest 组合可观察量之间的依赖关系
Dependency between combineLatest combined observables
我有一个看似简单的用例,在屏幕中我根据排序和 pageIndex 显示数据,这两者都通过 UI 进行更改。所以解决方案很简单
Observable
.combineLatest(sortObservable, pageIndexObservable, Pair::of)
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
但是当排序改变时,pageIndex 应该重置为 0。
如果我这样做
Observable
.combineLatest(
sortObservable.doOnNext(__ -> pageIndexObservable.onNext(0),
pageIndexObservable, Pair::of)
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
然后它发出 (last sort, 0) 然后马上发出 (new sort, 0),id 显然只想得到那个 (new sort, 0),或者以某种方式忽略那个 (last sort, 0),即有条件地阻止 pageIndexObservable 发射。
我不想使用 withLatestFrom,因为我希望 pageIndexObservable 发出来触发 getData
谢谢
您可以使用一个 BehaviorSubject<Pair>
和两个更新规则:
BehaviorSubject<Pair> query = BehaviorSubject.createDefault(Pair.of(0, 0));
query
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
.subscribe(/* ... */);
// ---------------------------------------
void changeSorting(int sort) {
Pair current = query.getValue();
query.onNext(Pair.of(sort, 0));
}
void nextPage() {
Pair current = query.getValue();
query.onNext(Pair.of(current.sort, current.pageIndex + 1));
}
我有一个看似简单的用例,在屏幕中我根据排序和 pageIndex 显示数据,这两者都通过 UI 进行更改。所以解决方案很简单
Observable
.combineLatest(sortObservable, pageIndexObservable, Pair::of)
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
但是当排序改变时,pageIndex 应该重置为 0。
如果我这样做
Observable
.combineLatest(
sortObservable.doOnNext(__ -> pageIndexObservable.onNext(0),
pageIndexObservable, Pair::of)
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
然后它发出 (last sort, 0) 然后马上发出 (new sort, 0),id 显然只想得到那个 (new sort, 0),或者以某种方式忽略那个 (last sort, 0),即有条件地阻止 pageIndexObservable 发射。
我不想使用 withLatestFrom,因为我希望 pageIndexObservable 发出来触发 getData
谢谢
您可以使用一个 BehaviorSubject<Pair>
和两个更新规则:
BehaviorSubject<Pair> query = BehaviorSubject.createDefault(Pair.of(0, 0));
query
.switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))
.subscribe(/* ... */);
// ---------------------------------------
void changeSorting(int sort) {
Pair current = query.getValue();
query.onNext(Pair.of(sort, 0));
}
void nextPage() {
Pair current = query.getValue();
query.onNext(Pair.of(current.sort, current.pageIndex + 1));
}