所以也许我的观察者模式都错了,但这就是我想要的。我有一个方法应该从数据库中获取一些整数。看起来像这样:
IObservable<int> GetInts()
每次他完成一个整数,他应该通过OnNext()自然地告诉它的订阅者。但是,如果一名观察员来参加聚会,他可能会错过一些电话。我仍然希望他知道所有的信息,所以当他订阅Observable时,应该把他填满#34;告诉他他错过的信息......然后继续告诉他什么时候添加新东西。
但是,在某些时候,数据库读取将结束,并且该方法将知道它。此时他应该在订阅者上调用OnComplete()。基本上我想要的是一个向人们讲述一些东西的集合。我还没有能找到像这样的东西,所以我必须实现它。它可能看起来像:
class MyObservable:List<int>,IObservable<int>{
private bool completed;
private List<IObserver<int>> observers = new List<IObserver<int>>();
public bool Completed{
get{return completed;}
set{
completed = value;
if(completed == true){
observers.ForEach(obs=>obs.OnCompleted());
}
}
}
public IDisposable Subscribe(IObserver<int> obs){
observers.Add(obs);
this.ForEach(n => obs.OnNext(n));
if(Completed) obs.OnCompleted();
return Disposable.Create(()=>observers.Remove(obs));
}
public void Add(int n){
observers.ForEach(obs => obs.OnNext(n));
base.Add(n);
}
}
有更好的方法吗?这样的东西已经在Rx中实现了吗?或者,如果我根本不应该这样做,那么什么是我最好的选择呢?
如果这是要走的路,我应该担心什么样的事情? (例如并发等等)。
答案 0 :(得分:1)
你想要一个ReplaySubject<int>
。它记得它收到的所有更新。当观察者订阅它时,观察者会收到主题的历史记录,然后是所有新的更新。
试试这个例子:
var subject = new ReplaySubject<int>();
subject.Subscribe(n => Console.WriteLine("A: {0}", n));
subject.OnNext(1);
subject.OnNext(2);
subject.OnNext(3);
Console.ReadLine();
subject.Subscribe(n => Console.WriteLine("B: {0}", n));
Console.ReadLine();
subject.OnNext(4);
subject.OnNext(5);
您应该获得如下所示的互动:
A: 1
A: 2
A: 3
<Press Enter>
B: 1
B: 2
B: 3
<Press Enter>
A: 4
B: 4
A: 5
B: 5