从阵列在Rx中创建热可观察对象



我该怎么做?

我有一个代码:

new int[]{1,2,3}.ToObservable().Subscribe(myObserver);

问题是,第一次呼叫是一个冷可观察的呼叫,因此在另一次这样的呼叫中:

new int[]{4,5,6}.ToObservable().Subscribe(myObserver);

myObserver根本不会触发onNext。显然是因为第一个调用发布了1,2,3, END。我不希望observable调用"END",因为我想稍后继续订阅。有没有一个函数可以轻松地为我做到这一点?

您需要执行以下操作:

new int[] { 1, 2, 3, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver); 
new int[] { 4, 5, 6, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver);

关键是对可观察对象执行.Concat(Observable.Never<int>()),以防止其永远结束。

在不知道这些可观察性在上下文中是如何使用的情况下,我的第一个建议是在订阅之前Concat这两个可观察器(或IEnumerables)。

(new int[]{1,2,3}.ToObservable())
.Concat(new int[]{4,5,6}.ToObservable())
.Subscribe(myObserver)

据我所知,在代码中的ToObservableSubscribe调用之间没有可以插入的方法来获得您想要的行为。这样的方法是可以编写的,但它不能很好地与库的其他部分配合使用。

Fwiw,要将Cold Observable变成Hot Observable,请使用Multicast:

var obs = new[] {1,2,3}.ToObservable()
    .Multicast(new Subject<int>())
// TODO: Subscribe as many people as you want
obs.Connect();  // Everyone subscribed gets 1,2,3,Completed now
obs.Subscribe(...);  // This guy gets no results

相关内容

  • 没有找到相关文章

最新更新