1

他の複数のオブザーバブルをマージしたオブザーバブルを作成するメソッドがあります。それぞれが特定のシンボルにサブスクライブして、そのデータを取得します。

var obs1 = dataSource
                .CreateObservable(someClass.Symbol1)
                .Select(result => ProcessData(result));

var obs2 = dataSource
                .CreateObservable(someClass.Symbol2)
                .Select(result => ProcessData(result));

var obs3 = dataSource
                .CreateObservable(someClass.Symbol3)
                .Select(result => ProcessData(result));

return Observable.Merge(obs1,obs2,obs3);


マージされたオブザーバブルを購読していますが、すべて問題ありません。ここで、シンボルのいずれかが変更された場合 (someClass.Symbol 1/2/3)、新しいシンボルを使用するためにオブザーバブルを再作成したいと考えています。シンボルが変化したときに通知を受け取ることができます。

RX を使用してオブザーバブルを自動的に再作成する方法はありますか? 多分 TakeUntil("symbol changed") のようなものを使用してから何かをしますか?

特にマージされたオブザーバブルを使用する場合、これが可能かどうかはわかりません。

4

2 に答える 2

2

IObservable<TSymbol> Symbol1Changed変更されるたびに新しいシンボルを送信するプロパティを作成できると仮定すると、次のようなものが機能します。

var obs1 = someClass.Symbol1Changed
    .StartWith(someClass.Symbol1) // to start it with the current value before the first change
    .Select(newSymbol => dataSource.CreateObservable(newSymbol))
    .Switch()
    .Select(result => ProcessData(result);

var obs2 = ...
var obs3 = ...

return Observable.Merge(obs1, obs2, obs3);

BehaviorSubjectプロパティに aを使用する場合は、次のSymbol1ことができます。

var obs1 = someClass.Symbol1
    .Select(newSymbol => dataSource.CreateObservable(newSymbol))
    .Switch()
    .Select(result => ProcessData(result);
...
于 2013-09-10T19:22:04.243 に答える
1

これは、Rx で確実に実行できます。それは、そのように設計されたものです。

ここで実際に説明しているのは、データの処理をトリガーするシンボルのソースが 3 つあるということです。3 つのシンボル ソースを作成します。

var symbol1s = new Subject<Symbol>();
var symbol2s = new Subject<Symbol>();
var symbol3s = new Subject<Symbol>();

次に、各オブザーバブルを次のように定義します。

var obs1 =
    symbol1s
        .Select(symbol =>
            dataSource
                .CreateObservable(symbol)
                .Select(result => ProcessData(result)))
        .Switch();

これは基本的に、新しいシンボルが登場するたびに、そのシンボルに基づいた新しいオブザーバブルに切り替えることを言っています。

3 つすべてを同じ方法で定義し、前に行ったようにマージします。

symbol1s.OnNext(someClass.Symbol1);次に、 (または同様の)を発行するだけで、準備完了です。

オブザーバブルを定義するためにサブジェクトを使用する必要はありません。プログラムでより意味がある場合は、イベントまたはその他のソースを使用できます。

于 2013-09-11T03:15:27.150 に答える