2016-05-16 1 views
0

Есть ли наблюдаемые кеши испускаемые предметы? У меня есть два испытания, которые приводят меня к разным выводам:Наблюдаемые кеши испускают предметы или нет?

От испытываемого # 1 я делаю вывод о том, что он делает:

Test # 1:

Observable<Long> clock = Observable 
    .interval(1000, TimeUnit.MILLISECONDS) 
    .take(10) 
    .map(i -> i++); 

//subscribefor the first time 
clock.subscribe(i -> System.out.println("a: " + i)); 

//subscribe with 2.5 seconds delay 
Executors.newScheduledThreadPool(1).schedule(
    () -> clock.subscribe(i -> System.out.println(" b: " + i)), 
    2500, 
    TimeUnit.MILLISECONDS 
); 

Выход №1:

a: 0 
a: 1 
a: 2 
    b: 0 
a: 3 
    b: 1 

Но второй тест показывает, что мы получаем разные значения для двух наблюдателей:

Test # 2:

Observable<Integer> observable = Observable 
       .range(1, 1000000) 
       .sample(7, TimeUnit.MILLISECONDS); 
observable.subscribe(i -> System.out.println("Subscriber #1:" + i)); 
observable.subscribe(i -> System.out.println("Subscriber #2:" + i)); 

Выход # 2:

Subscriber #1:72745 
Subscriber #1:196390 
Subscriber #1:678171 
Subscriber #2:336533 
Subscriber #2:735521 

ответ

1

Существует два вида наблюдений: горячие и холодные. Холодные наблюдаемые, как правило, генерируют одну и ту же последовательность своим Наблюдателям, если у вас нет внешних эффектов, таких как связанное с таймером действие, связанное с ним.

В первом примере вы получаете одну и ту же последовательность дважды, потому что нет внешних эффектов, кроме таймерных тиков, которые вы получаете по одному. Во втором примере вы выбираете быстрый источник, а выборка со временем имеет не детерминированный эффект: каждая наносекунда считается так, что даже малейшая неточность приводит к различному значению.

+0

но как rx lib знает, имеет ли код внешний эффект? Из-за того, что горячие наблюдаемые могут быть превращены в холод в любой момент, я делаю вывод, что как холодные, так и горячие наблюдатели должны помнить/кэшировать каждый испускаемый предмет, верно? Выглядит немного неэффективно –

+0

Вы не можете знать, и обычно это даже не актуально. Это ваш выбор, чтобы сохранить последовательности с кешем(), replay() или ReplaySubject. – akarnokd

+0

Да, вот почему я смущен. Я мог бы вызвать .cache(), но rx кэширует список всех элементов в любом месте. По крайней мере, я сделал этот вывод из теста №1 –

Смежные вопросы