2012-11-29 65 views
2

使用Rx,获取主题中当前观察者数量的最佳方法是什么?Rx中的观察者数量主题

我有,我要发布消息的情况下,但前提是有观察员。如果没有观察员,我需要做别的事情。

为了解决这个问题,我所做的就是创建了自己的ISubject实现,公开内部IObserver收集的计数。我确信必须有一个开箱即用的方式,我只是不完全熟悉Rx所提供的。

谢谢!

+0

为什么你会关心,如果您有观察员或不? – casperOne

+0

我不在乎我有观察员,就像我没有观察员时一样关心。 在我的应用程序中,我有处理某些消息的窗口。他们是观察员。如果没有窗户打开,我创建一个新的窗户。所以我需要知道什么时候我没有观察员来创建一个新窗口。 – bedo

+0

这听起来像是你将放入观察者的逻辑(不管它是在做你的窗口管理);把它放到你观察的东西看来是一个糟糕的设计决定。 – casperOne

回答

4

你应该避免实现你自己观察到的(或学科)实现只要有可能。

你当然可以尝试编写一个包装类来提供帮助。

试试这个:

public class Countable 
{ 
    private int _count; 
    public int Count { get { return _count; } } 
    public IObservable<T> GetCountable<T>(IObservable<T> source) 
    { 
     return Observable.Create<T>(o => 
     { 
      Interlocked.Increment(ref _count); 
      var subscription = source.Subscribe(o); 
      var decrement = Disposable.Create(() => 
      { 
       Interlocked.Decrement(ref _count); 
      }); 
      return new CompositeDisposable(subscription, decrement); 
     }); 
    } 
} 

然后你可以这样写代码:

var xs = new Subject<int>(); 
var countable = new Countable(); 
var ys = countable.GetCountable(xs); 
Console.WriteLine(countable.Count); 
var s1 = ys.Subscribe(y => { }); 
Console.WriteLine(countable.Count); 
var s2 = ys.Subscribe(y => { }); 
Console.WriteLine(countable.Count); 
s1.Dispose(); 
Console.WriteLine(countable.Count); 
s2.Dispose(); 
Console.WriteLine(countable.Count); 

我运行这个结果是:

0 
1 
2 
1 
0 
6

使用Subject<T>.HasObservers财产。

Source Code

我完全不记得它推出的时候,但我敢肯定,这是不是永远存在的。它可能是在Rx 2.0中添加的。

+0

这对我有很大的帮助。谢谢。 – Zoman

+0

而有趣的是,如果你使用的doOnUnsubscribe,它总是返回true,AFAICT – forresthopkinsa

1

使用subject.observers.length,例如:

import {Subject} from 'rxjs' 

let subject = new Subject() 
let s1 = subject.subscribe(v => console.log('observerA: ' + v)) 

subject.next(1) // observerA: 1 
console.log(subject.observers.length) // 1 


let s2 = subject.subscribe(v => { 
    console.log('observerB: ' + v) 
    if(v===3) s2.unsubscribe() 
}) 

subject.next(2) // observerA: 2 
console.log(subject.observers.length) // 2 

subject.next(3) // observerA: 3 
console.log(subject.observers.length) // 1 
+0

我不知道,如果这个工程在RxJS,但即使是这样,它不是标准Rx规范的一部分。如果我在推广中看到这一点,我倾向于认为这是一种黑客行为。 – forresthopkinsa