2016-09-18 6 views
3

rxcpp를 사용하는 방법을 이해하려고합니다. 관찰 가능 항목이 값을 내면 내 관찰자가 구독자가됩니다. on_next() 메소드가 호출되어 방출 된 값을 전달함으로써 알림을받습니다.rxcpp - 관찰자가 값을 내놓을 때 모든 관찰자의 on_next 함수가 호출되지 않는 이유

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

I 출력이 같은 것으로 예상 :

이 다음 예제의 경우되지 않습니다

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

이 고전 뜨거운 대 차가운 동작입니다.

뜨거운 관측 가능은 예상대로합니다. 간격은 차가운 관측 가능하므로 각 구독은 독립적 인 값 집합을 생성합니다.

퍼블리싱 오퍼레이터는 하나의 콜드 관찰 가능 (cold observable)을 취하여이를 뜨거운 관찰 가능 항목으로 공유합니다.

이 경우입니다.

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

그런 다음 구독 표현식에서 sharedvalues 대신 values 사용합니다.

hot vs cold observables를 검색하면이 주제에 대한 광범위한 논의가 있습니다.