"hot-swapping"可观察到我的主题中



我有以下主题,一次性"永不消失"类型的订阅。

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 上完全

简单!

相关内容

  • 没有找到相关文章

最新更新