为什么Observable.publish(Func1)和Observable.replay(Func1)返回Observable?

时间:2016-06-01 07:50:57

标签: rx-java

Observable.publish()Observable.replay()返回ConnectableObservable。 但是,当这些方法将接口作为参数(例如Observable.publish(Func1)Observable.replay(Func1))时,它们将返回Observable。

为什么他们返回Observable而不是ConnecatbleObservable?

如果我将这些方法与参数一起使用,我会得到Observable。 然后我将submit(Observer)称为观察者,观察者将开始工作。 我无法调用connect(),因为observable是Observable,而不是Connectable Observable。

如果我必须对ConnectableObservable使用Observable.publish(Func1)Observable.replay(Func1),我认为这些方法必须在ConnectableObservable中,而不是在Observable中。

为什么它们是Observable方法而不是ConnectableObservable方法?

2 个答案:

答案 0 :(得分:3)

这些运算符在函数调用期间共享源,也就是说,您可以订阅提供给函数的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);

VS

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);

答案 1 :(得分:0)

我注意到那些方法使原始的ConnectableObservable发出原始值,但这些方法使返回的Observable发出转换后的值。 而且,如果用户希望只有特定的观察者获得转换后的值,那就有意义了。

但是,我仍然想知道为什么这些方法不在ConnectableObservable中。