2016-11-15 5 views
2

0私は次のように単純なクラスを持って到達したときに廃棄を実行しRX:件名RefCountプロパティは

internal class DataProvider : IDataProvider 
{ 
    private readonly Subject<string> _dataChangeSubject = new System.Reactive.Subjects.Subject<string>(); 
    private IObservable<string> _dataChangeObservable; 

    public IObservable ObserveDataChange() 
    { 
     return _dataChangeObservable ?? (_dataChangeObservable = _dataChangeSubject.Publish().RefCount()); 
    } 
} 

上記通知するSubject.OnNext()を呼び出す他のコードを持っている実際のクラス、のちょうど抽出物であります変更。

私が知りたいのは、公開されたサブジェクトのRefCountがいつ0になったかを知ることができれば、そのサブジェクトを処分して他のクリーンアップ操作を実行できるということです。

+0

'_dataChangeSubject.Publish()。RefCount()'が返すものは?メソッド名から整数を返さなければなりませんが、使用法からは 'IObservable 'が返されます。 –

+0

はい、 'IConnectableObservable .RefCount()'は 'IObservable 'を返します。 –

+0

イベント「RefCountChanged」を導入して登録することはできますか? –

答えて

3

RefCount()を使用すると、サブスクリプションが0になるとシーケンスが完了します。したがって、Finallyを使用してシーケンスの完了をリスンすることができます。例:

internal class DataProvider 
{ 
    private readonly Subject<string> _dataChangeSubject = new System.Reactive.Subjects.Subject<string>(); 
    private IObservable<string> _dataChangeObservable; 

    public IObservable<string> ObserveDataChange() 
    { 
     return _dataChangeObservable ?? 
      (_dataChangeObservable = _dataChangeSubject.Finally(() => { /* Do cleanup here */ }).Publish().RefCount()); 
    } 
}