RxJava — кэш () — это то же самое, что и повтор ()?

Мне было интересно, есть ли оператор cache(), который может кэшировать x количество выбросов, но также истечать их через определенный интервал времени (например, 1 минуту). Я искал что-то вроде...

Observable<ImmutableList<MyType>> cachedList = otherObservable
    .cache(1, 1, TimeUnit.MINUTES); 

Это приведет к кэшированию одного элемента, но срок его действия истечет, и кеш будет очищен через минуту.

Я провел небольшое исследование и нашел оператора replay. Казалось, что это удовлетворит эту потребность, но у меня есть несколько вопросов. Почему он горячий и должен быть подключен? Отличает ли это его от оператора cache()? Я знаю, что cache() имитирует тему, но не требует подключения.


person tmn    schedule 11.09.2015    source источник


Ответы (1)


cache и replay предназначены для разных вариантов использования. Cache — это автоматически подключаемый контейнер для воспроизведения всего, который обычно используется для долгосрочных повторов. Воспроизведение может иметь больше параметров и может выполнять повторы с ограниченным временем / размером, но требует, чтобы разработчик указал, когда начинать. Оператор autoConnect() позволяет превратить такие экземпляры ConnectableObservable в простой экземпляр Observable, который подключается к источнику после того, как подписчик подпишется на них. Таким образом, вы можете иметь ограниченный и автоматически подключающийся повтор (требуется RxJava 1.0.14+):

source.replay(1, TimeUnit.SECONDS).autoConnect().subscribe(...);
person akarnokd    schedule 12.09.2015
comment
Вероятно, вам следует упомянуть, что autoconnect является экспериментальным. - person Reut Sharabani; 29.10.2015
comment
Теперь, скорее всего, он станет стандартным API: github.com/ReactiveX/RxJava/pull/3391< /а> - person akarnokd; 29.10.2015