UniRxでObservable -> IEnumerator -> Observable変換した時のライフサイクル
コード
gist9ab1097554ad9f37a8931f82cfdcb467
破棄されない話
.SelectMany()にCoroutineを使用するとうまく破棄されない。
.ToYieldInstruction()を使ってObservable -> IEnumeratorに変換したCoroutineを実行中にコンポーネントを削除するとエラーを吐き出す。
.ToYieldInstruction()したCoroutineはどうやら源流のObservableに紐づけられないようなので
別途.AddTo()でライフサイクルを定義してあげる必要がある
CompositeDisposableなどを使用したライフサイクル管理をしている場合は
- 引数でライフサイクルの依存先を渡す
- Observable.FromCoroutine(_ => Coroutine()).AddTo(依存先)
でなんとかできるのではないでしょうか。
追記
@YutaDevelop ToYieldInstructionにCancellationTokenを渡すのが、伝搬方法になっているのですが、SelectManyでは繋ぎにくいですね、一応模範解答はこうですが、面倒くさいのは否めない。 https://t.co/qPPtEVrtOG
— neuecc (@neuecc) 2017年2月20日
作者様
よりご回答いただきました、模範解答はこちらのようです。
CancellationTokenと言う仕組みがあり、引数にそいつを渡してあげることでライフサイクルを定義できるようです。
シランカッタ・・・
使うときはちゃんとオペレータの実装も見ないといかんですね。
neuecc様有難うございました。
終わり