我有一个 ConnectableObservable ,它在订阅时将按原始顺序(从旧到最新)重播最后 x 个项目以及之后的任何后续事件。
我使用这个 Observable 作为事件记录器的后备存储,但是在订阅时,我实际上希望以相反的顺序(从最新到最旧)推送/onNext'ed 重播项目,以便我可以首先显示最相关的项目。
这对标准 RX 操作员是否可行,还是我必须创建一个自定义操作员?
我有一个 ConnectableObservable ,它在订阅时将按原始顺序(从旧到最新)重播最后 x 个项目以及之后的任何后续事件。
我使用这个 Observable 作为事件记录器的后备存储,但是在订阅时,我实际上希望以相反的顺序(从最新到最旧)推送/onNext'ed 重播项目,以便我可以首先显示最相关的项目。
这对标准 RX 操作员是否可行,还是我必须创建一个自定义操作员?
您不能这样做,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));
});