私はMVVMをかなり使い慣れているので、この問題によく知られている解決策があればよろしくお願いいたします。MVVMモデルのノンブロッキング遅延ロードプロパティ
私たちは、いくつかの追加のプロパティだけでなく、必要に応じてWeb API呼び出しを行うことで遅延ロードすることができるいくつかのコアプロパティを持つモデルクラスを構築しています(更新: lazily-loadedプロパティごとのWeb APIコールとなります)。
複数のモデルを用意するのではなく、そこにレイジーロードロジックを持つ単一のモデルを用意することが賢明です。しかし、レイジーロードされたプロパティは、ViewModelにバインドしてモデルにバインドするときにUIスレッドをブロックしないように、アクセス時にブロックするべきではないようです。
このように、モデルの遅延プロパティにアクセスすると、非同期フェッチを開始してすぐにデフォルト値(たとえばnull
)が返されるようなパターンが考えられました。非同期フェッチが完了すると、PropertyChanged
イベントが発生し、ViewModel/Viewはフェッチされた値に再バインドできます。
は、私はこれを試してみたのだが、非常にうまく動作するようだが、思っていた:
- が、私はまだ知ったしていないこのアプローチのいずれかの落とし穴がありますが、ように実行されますアプリは複雑になりますか?
- フレームワークに組み込まれている、または第三者フレームワークの一部として広く使用されているこの問題に対する既存のソリューションはありますか?
これらのローズローダーのすべてでPropertyChangedイベントをリッスンする必要があります。つまり、これらのローダーの複数に依存するプロパティまたは関数がある場合、独自のコードを実行する前に、依存するすべてのローダーが終了するまで待ちます。 これは、そうでなければ、別のスレッド内で "同期的に"レイジーローダをフェッチすることを組み合わせた単一のスレッドコールとして記述された多くのロジックを記述しなければならなくなる可能性があります。 –
@ティモシー - 良い点。私はすでにそれについて考えていましたが、遅れてロードされたデータの性質上、何かが遅延データの複数の部分に依存する可能性は低いと感じています。 1つの遅延データに複数のものが依存する可能性は高いですが、問題はないと思います。 –
私はあなたが上で説明した正確なアプローチを使用し、それは非常にうまくいっています。 – Jeff