ViewModels ライフサイクルで発生した問題について、@slodge のサンプルの 1 つを変更しました。
N26 を少し変更しました: https://github.com/csteeg/NPlus1DaysOfMvvmCross/tree/viewmodeldisposesample/N-26-Fraggle
このブランチでは、mvxmessenger プラグインを使用して、問題が発生した場所を表示できます。コードはきれいではありませんが、間違っていることを示しています。ビューがなくなっても、Id = 0 の SubViewModel がメッセージを受信し続ける様子を見ることができます。また、(ある時点で) HomeViewModel がメッセージの受信を停止する方法。
再現手順 (クリーンアップされたデバッグ出力を含む):
アプリを起動
HomeViewModel:Warning:HomeViewModel 0 received: Created HomeViewModel0
ボタン「1」をクリックします
HomeViewModel:Warning:HomeViewModel 0 received: Created SubViewModel0
SubViewModel:Warning:SubViewModel 0 received: Created SubViewModel0
HomeViewModel:Warning:HomeViewModel 0 received: Created FirstViewModel0
SubViewModel:Warning:SubViewModel 0 received: Created FirstViewModel0
FirstViewModel:Warning:FirstViewModel 0 received: Created FirstViewModel0
後ろをクリック
HomeViewModel:Warning:HomeViewModel 0 received: Destroyed FirstView for viewmodel 0
SubViewModel:Warning:SubViewModel 0 received: Destroyed FirstView for viewmodel 0
FirstViewModel:Warning:FirstViewModel 0 received: Destroyed FirstView for viewmodel 0
HomeViewModel:Warning:HomeViewModel 0 received: Destroyed SubFrag for viewmodel 0
SubViewModel:Warning:SubViewModel 0 received: Destroyed SubFrag for viewmodel 0
FirstViewModel:Warning:FirstViewModel 0 received: Destroyed SubFrag for viewmodel 0
HomeViewModel:Warning:HomeViewModel 0 received: Destroyed DubFrag for viewmodel 0
SubViewModel:Warning:SubViewModel 0 received: Destroyed DubFrag for viewmodel 0
FirstViewModel:Warning:FirstViewModel 0 received: Destroyed DubFrag for viewmodel 0
ここでビューが破壊されているのを見ることができます。ビューモデルも一緒に行くと思います
ボタン「1」をもう一度クリックします
HomeViewModel:Warning:HomeViewModel 0 received: Created SubViewModel1
SubViewModel:Warning:SubViewModel 0 received: Created SubViewModel1
FirstViewModel:Warning:FirstViewModel 0 received: Created SubViewModel1
SubViewModel:Warning:SubViewModel 1 received: Created SubViewModel1
HomeViewModel:Warning:HomeViewModel 0 received: Created FirstViewModel1
SubViewModel:Warning:SubViewModel 0 received: Created FirstViewModel1
FirstViewModel:Warning:FirstViewModel 0 received: Created FirstViewModel1
SubViewModel:Warning:SubViewModel 1 received: Created FirstViewModel1
FirstViewModel:Warning:FirstViewModel 1 received: Created FirstViewModel1
ご覧のとおり、subviewmodel 0 はまだメッセージを受信しています。アタッチされていないビューモデルへのメッセージの送信を停止する必要があることをどうにかして伝えることができますか? または、ビューモデルはアタッチされていないことを認識できますか
ここで、これらの手順をかなりの時間 (エミュレーターで 15 回など) 繰り返し続けると、一部のビューモデルがメッセージの受信を停止します (ガベージ コレクションが行われていると思います)。奇妙なことに、これらのビューの 1 つがHomeViewModelです。HomeView は決して破棄されませんが、homeviewmdoel はメッセージの受信を停止するため、アプリが必要とする場合に応じてビューを更新することはできません。