我有一个可观察的值,它发出独特的值,例如
var source=Observable.Range(1,100).Publish();
source.Connect();
我想观察它的价值,例如两个观察者,但每个观察者仅收到其他观察者未看到的值的通知。
因此,如果第一个观察者包含值 10,则第二个观察者永远不会收到关于 10 值的通知。
Update
我选择了 @Asti 的答案,因为它是第一个,尽管有问题,但它指出了正确的方向,并对 @Shlomo 的答案投了赞成票。太糟糕了,我不能接受这两个答案,因为@Shlomo 的答案更正确,我真的很感谢他在这个标签上为我们提供的所有帮助。
对于不同的观察者来说,可观察量不应该有不同的行为;更好的方法是为每个观察者提供自己的过滤可观察值。
话虽这么说,如果您的约束要求您需要在单个可观察中执行此行为 - 我们可以使用循环方法。
public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source)
{
for (; ; )
foreach (var item in source.ToArray())
yield return item;
}
public static IObservable<T> RoundRobin<T>(this IObservable<T> source)
{
var subscribers = new List<IObserver<T>>();
var shared = source
.Zip(subscribers.Repeat(), (value, observer) => (value, observer))
.Publish()
.RefCount();
return Observable.Create<T>(observer =>
{
subscribers.Add(observer);
var subscription =
shared
.Where(pair => pair.observer == observer)
.Select(pair => pair.value)
.Subscribe(observer);
var dispose = Disposable.Create(() => subscribers.Remove(observer));
return new CompositeDisposable(subscription, dispose);
});
}
Usage:
var source = Observable.Range(1, 100).Publish();
var dist = source.RoundRobin();
dist.Subscribe(i => Console.WriteLine($"One sees {i}"));
dist.Subscribe(i => Console.WriteLine($"Two sees {i}"));
source.Connect();
Result:
One sees 1
Two sees 2
One sees 3
Two sees 4
One sees 5
Two sees 6
One sees 7
Two sees 8
One sees 9
Two sees 10
如果您已经有了观察者列表,代码就会变得简单得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)