2016-06-01 3 views
1

Observable.publish() и Observable.replay() возвращает ConnectableObservable. Но когда этот метод принял интерфейс как параметр (например, Observable.publish(Func1) и Observable.replay(Func1)), они вернутся Observable.Почему наблюдаемые наблюдаемые (Func1) и Observable.replay (Func1) наблюдаемые наблюдаемые?

Почему они возвращаются Наблюдаемые вместо ConnecatbleObservable?

Если бы я использовал эти методы с параметром, я бы получил Observable. И затем я позвонил submit(Observer) в наблюдаемое, наблюдаемое начало работать. Я не мог позвонить connect(), поскольку наблюдаемый был бы Наблюдаемым, а не Подключенным Наблюдаемым.

Если мне нужно использовать Observable.publish(Func1) и Observable.replay(Func1) для ConnectableObservable, я думаю, что эти методы должны быть в ConnectableObservable, а не в Observable.

Почему методы Observable, но не методы ConnectableObservable?

ответ

2

Эти операторы разделяют источник на время вызова функции, то есть вы можете подписаться на Observable, предоставляемый вашей функции, и применять операторов по своему усмотрению. Они не будут инициировать множественные подписки на исходный источник; но это происходит для каждого Абонента для результата оператора отдельно. Поэтому сама подписка запускает соединение с восходящим потоком, и нет необходимости делать это вручную через ConnectableObservable.

Например:

Observable.range(1, 10) 
.doOnSubscribe(() -> System.out.println("Subscribed!")) 
.publish(o -> Observable.zip(o, o.skip(1), (a, b) -> a + b)) 
.subscribe(System.out::println); 

против

Observable<Integer> o = Observable.range(1, 10) 
.doOnSubscribe(() -> System.out.println("Subscribed!")); 

Observable.zip(o, o.skip(1), (a, b) -> a + b) 
.subscribe(System.out::println); 
+0

Спасибо. Теперь я понимаю причину и пользу. Но я полностью смущен объяснением JavaDocs. Этот метод делает что-то с ConnectableObservable? Но это отличается от темы вопроса. Я могу подумать об этом некоторое время, и я могу задать вопрос, когда я не смогу достичь ответа. Кстати, я рад, что вы стали ведущим спонсором. Поздравления! – otal

0

Я заметил, что эти методы заставили исходный ConnectableObservable испускать исходные значения, но эти методы заставили возвращенный Observable испускать преобразованные значения. И, если пользователи хотели, чтобы только конкретный наблюдатель получил преобразованное значение, это имеет смысл.

Но я все еще удивляюсь, почему эти методы не находятся в ConnectableObservable.

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