4

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

出力は次のようになると予想していました。

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
4

1 に答える 1

3

これは、古典的なホット対コールドの動作です。

ホットオブザーバブルは期待どおりに機能します。Interval はコールド オブザーバブルであるため、各サブスクライブは独立した一連の値を生成します。

パブリッシュ オペレーターは、単一のコールド オブザーバブルを取得し、それをホット オブザーバブルとして共有します。

この場合はそうでしょう。

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

次に、サブスクライブ式でsharedvalues代わりに使用します。values

ホットとコールドの観測量を検索すると、このトピックに関する広範な議論が見つかります。

于 2016-09-25T19:18:09.557 に答える