我有以下主题,一次性"永远不会消失"类型订阅。
var subject = new Subject<int>();
subject.Subscribe(Console.WriteLine, () => Con.WriteLine("OnComplete"));
现在上面的代码后面跟着这段代码
var sub = Observable.Return(0).Subscribe(subject);
sub.Dispose();
sub = Observable.Return(1).Subscribe(subject);
我只在控制台中看到0然后我看到&#34; OnComplete&#34;,我没有看到1.因为当一个可观察到的主题的订阅被处理时,主题可能会调用OnComplete
来所有它的订阅者。无论如何要保持订阅Subject
还活着吗?
我不一定要使用某个主题。
答案 0 :(得分:3)
问题是,Observable.Return(0)
会产生.OnNext(0)
后跟.OnCompleted()
subject
得到的.OnNext()
,并且由于Rx中的合同为零或更多{{1}其后是.OnCompleted()
或.OnError()
之一。之后,不再有.OnNext()
。
因此,您必须使用一种方法来避免要添加的每个可观察对象的.OnCompleted()
。
首先你改变你的主题:
var subject = new Subject<IObservable<int>>();
现在订阅更改为包含.Switch()
:
subject
.Switch()
.Subscribe(
Console.WriteLine,
() => Console.WriteLine("OnComplete"));
.Switch()
仅将IObservable<IObservable<int>>
展平为IObservable<int>
,只输出最近的内部可观察量的值,但仅在外部可观察量完成时才完成。
然后你就这样使用它:
subject.OnNext(Observable.Return(0));
subject.OnNext(Observable.Return(1));
subject.OnCompleted();
现在你得到这个输出:
0 1 OnComplete
容易!