我试图了解如何使用rxcpp,我的印象是当一个observable发出一个值时,所有被订阅的观察者都会通过调用他们的on_next()方法得到通知,并将它们传递给它们。 / p>
以下示例不是这种情况:
auto eventloop = rxcpp::observe_on_event_loop();
printf("Start task\n");
auto values = rxcpp::observable<>::interval(std::chrono::seconds(2)).map(
[](int i){
printf("Observable sending: %d\n", i);
return i;
}
);
values.
subscribe_on(eventloop).
take(2).
as_blocking().
subscribe(
[](int v){printf("#1 onNext: %d\n", v);},
[](){printf("#1 onCompleted\n");});
values.
subscribe_on(eventloop).
take(2).
as_blocking().
subscribe(
[](int v){printf("#2 onNext: %d\n", v);},
[](){printf("#2 onCompleted\n");});
printf("Finish task\n");
我希望输出类似于:
Start task
Observable sending: 1
#1 onNext: 1
#2 onNext: 1
Observable sending: 2
#1 onNext: 2
#1 onCompleted
#2 onNext: 2
#2 onCompleted
Finish task
即。当新值出现时,在所有订阅的观察者上调用on_next。
相反,输出实际上是:
Start task
Observable sending: 1
#1 onNext: 1
Observable sending: 2
#1 onNext: 2
#1 onCompleted
Observable sending: 1
#2 onNext: 1
Observable sending: 2
#2 onNext: 2
#2 onCompleted
Finish task
答案 0 :(得分:2)
这是典型的热与冷行为。
一个热门的观察者会像你期望的那样做。 Interval是一个冷可观察对象,因此每个订阅都会产生一组独立的值。
发布运算符将采用单个冷可观察对象并将其作为热可观察对象共享。
在这种情况下,它会。
auto sharedvalues = values.publish().ref_count();
然后在订阅表达式中使用sharedvalues
而不是values
。
搜索热与冷可观察量将找到对该主题的广泛讨论。