我很擅长使用Reactive Extensions,所以这可能是一个新手问题,但我有以下情况:
我从数据库中获取3个IEnumerable列表(不同类型)并填充视图模型。然而,我想协调订阅以在所有列表完成加载时触发某些内容。这是可能的Reactive Extensions还是我在以错误的方式思考?代码就像这样:
GetCustomers()
.ToObservable(Scheduler.Default)
.Buffer(20).ObserveOn(SynchronizationContext.Current)
.Subscribe(View.Model.AddRange);
GetCountries()
.ToObservable(Scheduler.Default)
.Buffer(20).ObserveOn(SynchronizationContext.Current)
.Subscribe(View.Model.AddRange);
GetTransports()
.ToObservable(Scheduler.Default)
.Buffer(20).ObserveOn(SynchronizationContext.Current)
.Subscribe(View.Model.AddRange);
答案 0 :(得分:3)
您可以尝试使用可观察的联接。像这样:
var plan =
Observable.Start(() => GetCountries())
.And(Observable.Start(() => GetCustomers()))
.And(Observable.Start(() => GetTransports()))
.Then((countries, customers, transports)
=> new { countries, customers, transports });
var query =
Observable.When(new [] { plan });
query
.Subscribe(cct =>
{
View.Model.AddRange(cct.countries);
View.Model.AddRange(cct.customers);
View.Model.AddRange(cct.transports);
});
它并行运行,你可以在最后得到所有结果。
答案 1 :(得分:0)
我不确定你为什么要将已经同步的Enumerable改为一个Observable,但是在Rx习语中你可以:
Observable.Merge(Add(GetCustomers()), Add(GetCountries())..., Add(GetTransports()))
.Subscribe(() => { }, Completed);
其中Add可以是:
private IObservable<Unit> Add<T>(IObservable<T> o)
{
return o.Buffer(20)
.ObserveOn(SynchronizationContext.Current)
.Do(View.Model.AddRange)
.Select(_ => Unit.Default);
}