我有一个ConnectableObservable,订阅该对象后,它将按其原始顺序(从最旧到最新)重播最后x个项目,并在其后回放任何后续事件。
我正在使用此Observable作为事件吸墨纸的后备存储,但是在订阅时,我实际上希望以相反的顺序(从最新到最旧)推送/打开下一个重放的项目,因此我可以显示最相关的首先。
使用标准的RX运算符可以实现吗?还是我必须创建一个自定义的运算符?
答案 0 :(得分:0)
您无法使用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));
});