2016-09-18 77 views
3

我想了解如何使用rxcpp,我的印象是当observable发出一个值时,所有订阅的观察者都会通过调用他们的on_next()方法来获得通知,将它们的发射值传递给它们。rxcpp - 为什么所有观察者的on_next函数在observable发出值时都会被调用

这是不是与下面的示例中的情况:我所期望的输出是这样的

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 
+1

使用as_blocking()将阻止第二个订阅开始,直到第一个完成 –

回答

2

这是典型的热与冷的行为。

热点观察将按照您的预期进行。区间是一个冷观察值,因此每个订阅都会产生一组独立的值。

发布操作员将采取一个冷观察,并将其作为一个热点观察。

在这种情况下,它会。

auto sharedvalues = values.publish().ref_count(); 

然后用sharedvalues代替values在认购表达式。

寻找热vs冷观察对象会发现这个话题的广泛讨论。

相关问题