0

I have this seemingly easy use case where in a screen I display data based on sort, and pageIndex, both of which change via UI. So solution is easy

Observable
    .combineLatest(sortObservable, pageIndexObservable, Pair::of)
    .switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))

However when sort changes, pageIndex should reset to 0.

If I do

Observable
    .combineLatest(
         sortObservable.doOnNext(__ -> pageIndexObservable.onNext(0),
         pageIndexObservable, Pair::of)
    .switchMap(tuple -> getData(tuple.sort, tuple.pageIndex))

Then it emits (last sort, 0) and then right away (new sort, 0), id obviously only want to get that (new sort, 0), or somehow ignore that (last sort, 0), i.e. conditionally block pageIndexObservable from emitting.

I dont want to use withLatestFrom because I want pageIndexObservable emits to trigger getData

Thanks

4

1 回答 1

0

您可以使用一个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));
}
于 2018-01-30T09:21:55.540 回答