我有一个方法可以创建一个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时。
答案 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);
(或类似的),你就可以了。
您不必使用主题来定义您的可观察量。如果在您的程序中更有意义,您可以使用事件或其他来源。