Воспроизведение кэшированных элементов в обратном порядке при подписке - PullRequest
0 голосов
/ 20 октября 2018

У меня есть ConnectableObservable, который после подписки будет воспроизводить последние x элементов в их исходном порядке (от самого старого до самого нового) и любые последующие события после.

Я использую этот Observable в качестве резервного хранилища для событияblotter, однако после подписки я бы хотел, чтобы воспроизведенные элементы были помещены в / в порядке в обратном порядке (от самого нового к старому), чтобы я мог сначала отобразить наиболее релевантные элементы.

Возможно ли это со стандартным приемомоператоры или мне придется создавать кастомный?

1 Ответ

0 голосов
/ 20 октября 2018

Вы не можете сделать это с 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));
});
...