新数据到达后自动重新创建observable

时间:2013-09-10 18:26:37

标签: c# system.reactive

我有一个方法可以创建一个observable,它是多个其他observable的合并。每个人都订阅某个符号来获取其数据:

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


我订阅了合并的observable,一切都很好。现在,当任何符号被更改时(someClass.Symbol 1/2/3),我希望重新创建observable以使用新符号。我可以在符号更改时收到通知。

有没有办法使用RX让observable自动重新创建?也许使用类似TakeUntil(“符号改变”)然后做某事的东西?

不确定这是否可行,尤其是在使用合并的observable时。

2 个答案:

答案 0 :(得分: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媒体资源使用Symbol1,那么您可以这样做:

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

答案 1 :(得分:1)

你当然可以用Rx做到这一点。这是它设计的目的。

您在这里真正描述的是,您将有三个符号源,您希望触发数据处理。因此,创建三个符号源:

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

现在定义每个observable:

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

这基本上是说随着每个新符号切换到基于该符号的新观察值。

以相同的方式定义所有三个,然后像之前一样进行合并。

然后只发出一个symbol1s.OnNext(someClass.Symbol1);(或类似的),你就可以了。

您不必使用主题来定义您的可观察量。如果在您的程序中更有意义,您可以使用事件或其他来源。