私は様々な方法で観測可能なものを作り、利害関係者に返信しますが、聞いていると、観測可能なものを分解して、リソースを消費し続けることができません。 pubサブシステムでトピックを作成することと考える方法もあります。誰もトピックにそれ以上購読していないときは、トピックとそれ以上のフィルタリングを保持したくありません。最後のオブザーバーが退会したときにイベントの公開を停止するRx observableを作成するにはどうしたらいいですか?
6
A
答えて
10
Rxは、すでにあなたのニーズに合わせてオペレータがある - も2実際に - Publish
& RefCount
。
は、ここでそれらを使用する方法は次のとおりです。
IObservable xs = ...
var rxs = xs.Publish().RefCount();
var sub1 = rxs.Subscribe(x => { });
var sub2 = rxs.Subscribe(x => { });
//later
sub1.Dispose();
//later
sub2.Dispose();
//The underlying subscription to `xs` is now disposed of.
シンプル。
1
あなたの質問を理解している場合は、すべてのサブスクライバがサブスクリプションを廃棄した、つまりサブスクライバがなくなったときに、オブザーバブルが作成から停止するようなクリーンアップ機能を実行する。 これは、あなたが、あなたは以下のような何かを行うことができます欲しいものである場合:
//Wrap a disposable
public class WrapDisposable : IDisposable
{
IDisposable disp;
Action act;
public WrapDisposable(IDisposable _disp, Action _act)
{
disp = _disp;
act = _act;
}
void IDisposable.Dispose()
{
act();
disp.Dispose();
}
}
//Observable that we want to clean up after all subs are done
public static IObservable<long> GenerateObs(out Action cleanup)
{
cleanup =() =>
{
Console.WriteLine("All subscribers are done. Do clean up");
};
return Observable.Interval(TimeSpan.FromSeconds(1));
}
//Wrap the observable
public static IObservable<T> WrapToClean<T>(IObservable<T> obs, Action onAllDone)
{
int count = 0;
return Observable.CreateWithDisposable<T>(ob =>
{
var disp = obs.Subscribe(ob);
Interlocked.Increment(ref count);
return new WrapDisposable(disp,() =>
{
if (Interlocked.Decrement(ref count) == 0)
{
onAllDone();
}
});
});
}
//使用例:
Action cleanup;
var obs = GenerateObs(out cleanup);
var newObs = WrapToClean(obs, cleanup);
newObs.Take(6).Subscribe(Console.WriteLine);
newObs.Take(5).Subscribe(Console.WriteLine);
関連する問題
- 1. ANGULAR:Timerから退会した後に別の機能を注入するObservable
- 2. Rx - onNext()を受信した後に自動的に退会する方法は?
- 3. 私の一時停止がゲームのループをpygameで果たしたときに、ゲームの再開を止めるにはどうしたらいいですか?
- 4. 1つのコンテナがドッカーの作成で停止したときに、すべてのコンテナを停止するにはどうすればよいですか?
- 5. すべてのオブザーバーがObservableから登録を解除したときにイベントがありますか?
- 6. Instagram Feedのインデックス作成を停止するにはどうしたらいいですか?
- 7. pthread_joinでスレッドが停止するのを止めるにはどうしたらいいですか?
- 8. タイマーを停止するにはどうしたらいいですか?
- 9. スレッドを停止するにはどうしたらいいですか?
- 10. イベントから退会する必要があるときにビューをどのように伝えますか?
- 11. rxJavaは、退会時に観測を停止します
- 12. イベントを辞退した後にオプションを変更するにはどうすればよいですか?
- 13. バックグラウンドワーカーをキャンセル/停止するにはどうしたらいいですか? doowrkイベントで
- 14. 最後のオブザーバーがサブスクライブを解除したときにAsyncSubjectが完了しないようにする方法
- 15. 観測対象から退会するにはどうしたらいいですか?
- 16. rxjs observableから即座に退会
- 17. メモリリークを防ぐためにRx SubscriptionとObservableをクリーンアップするにはどうすればいいですか?
- 18. アンドロイドで最近一時停止したアクティビティを再開するにはどうすればよいですか?
- 19. クライアントがサーバー送信イベントから退会したときに通知する方法はありますか?
- 20. exec()の後に新しく実行されたプログラムの最初の命令で子プロセスを停止するにはどうしたらいいですか?
- 21. 次のコマンドの終了後にbashから開始されたバックグラウンドプロセスを停止するにはどうしたらいいですか?
- 22. setNavigationBarHidden - ので、私はGoogleマップSDKで動作するようにしようとしていますし、私はマップを移動し、私が停止したときにそれを公開したときに、ナビゲーションバーを非表示にしたかった
- 23. ユーザーがクリックしたときにテキストがサイクリングを停止するにはどうすればよいですか?
- 24. 最後のdivに達したときに.animate()を停止する
- 25. ユーザ入力のためにMonkeyrunnerを一時停止するにはどうしたらいいですか?
- 26. ボタンを押した後にボタンの動作が停止する
- 27. ターゲットを見つけたらスレッドを停止するにはどうしたらいいですか?
- 28. FileSystemWatcher、イベントからの退会
- 29. RxJS 5からの退会はどのようにしてできますか?
- 30. バックグラウンドビデオが停止したときに音声が停止する