1

我有一个 ConnectableObservable ,它在订阅时将按原始顺序(从旧到最新)重播最后 x 个项目以及之后的任何后续事件。

我使用这个 Observable 作为事件记录器的后备存储,但是在订阅时,我实际上希望以相反的顺序(从最新到最旧)推送/onNext'ed 重播项目,以便我可以首先显示最相关的项目。

这对标准 RX 操作员是否可行,还是我必须创建一个自定义操作员?

4

1 回答 1

1

您不能这样做,replay()因为您只需要在未终止的源上获取缓存的项目。但是,ReplaySubject让您查看它并获取可以反转的项目数组,然后与来自同一主题的其余项目连接,但跳过刚刚检索到的快照项目:

ReplaySubject<ItemType> subject = ReplaySubject.create();

source.subscribe(subject);

Observable<ItemType> result = Observable.defer(() -> {
    ItemType[] current = subject.getValues(new ItemType[0]);

    return Observable.range(0, current.length)
        .map(index -> current[current.length - 1 - index])
        .concatWith(subject.skip(current.length));
});
于 2018-10-19T22:04:19.347 回答