2015-09-11 13 views
10

Zastanawiam się, czy istnieje operator cache(), który może buforować x liczbę emisji, ale także wygasać po określonym czasie (np. 1 minuta). Szukałem czegoś podobnego ...RxJava - Czy pamięć podręczna() jest taka sama jak funkcja odtwarzania()?

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

Spowoduje to buforowanie jednego elementu, ale wygaśnie i wyczyści pamięć podręczną po minucie.

Zrobiłem trochę badań i znalazłem operatora replay. Wyglądało na to, że zaspokoi tę potrzebę, ale mam kilka pytań. Dlaczego jest gorąco i wymaga podłączenia? Czy to różni się od operatora cache()? Wiem, że cache() naśladuje obiekt, ale nie wymaga połączenia.

Odpowiedz

22

cache i replay są przeznaczone do różnych zastosowań. Pamięć podręczna to automatycznie łącząca się powtórka - wszystko, co zwykle używane jest do odtwarzania długoterminowego. Replay może mieć więcej parametryzacji i może wykonywać powielone powtórzenia czasu/rozmiaru, ale wymaga od programisty określenia czasu rozpoczęcia. Operator autoConnect() umożliwia przekształcenie takich instancji ConnectableObservable na zwykły Observable, który łączy się ze źródłem, gdy subskrybent je subskrybuje. W ten sposób można mieć ograniczony i automatycznego łączenia powtórka (wymaga RxJava 1.0.14+):

source.replay(1, TimeUnit.SECONDS).autoConnect().subscribe(...); 
+0

Powinieneś raczej wspomnieć 'autoconnect' jest eksperymentalna –

+2

Jest teraz bardziej prawdopodobne, aby stać się standardem API: https: //github.com/ReactiveX/RxJava/pull/3391 – akarnokd