我有以下主题,一次性"永不消失"类型的订阅。
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,然后我看到"OnComplete",我没有看到 1。因为当一个可观察对象的订阅被释放时,主题可能会调用OnComplete
到它的所有订阅者。有没有办法让订阅Subject
保持活动状态?
不过,我不一定要使用主题。
问题是Observable.Return(0)
产生一个.OnNext(0)
,后跟一个subject
得到的.OnCompleted()
- 并且由于 Rx 中的合约为零或多.OnNext()
后跟.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 上完全
简单!