我在我的ViewModel中有一個排序問題,這似乎與線程有關,但我無法完全弄清楚我們發生了什麼問題或者我的「修復」是如何修復它的。MvvmCross ShowViewModel加載順序
我有一個ViewModel需要調用異步方法來加載其初始數據。我從MvvmCross自動調用的Init方法調用異步方法。如果加載失敗,出於任何原因,我想顯示一個錯誤屏幕,但調用Init方法內部的ShowViewModel不會產生預期的結果。正確調用ShowViewModel,但是在調試器中跟蹤它,看起來ErrorViewModel在原始ViewModel/View完成加載之前顯示 - 因此加載但未出現,因爲它被原始ViewModel覆蓋。
下面是加載代碼的簡化版本:
public async Task Init()
{
await LoadInitialDataAsync();
}
protected async Task LoadInitialDataAsync()
{
var loadResult = await LoadSomeStuffAsync();
if (loadResult.IsBadNews)
{
ShowViewModel<ErrorViewModel>();
return;
}
}
的MvxTrace日誌告訴我,ShowViewModel叫上ErrorViewModel它被稱爲初始視圖模型後,但只有最初的視圖顯示,而不是ErrorView。
要「解決」這個問題,我可以做兩件事情之一。
我可以包裝在Task.Run調用LoadInitialDataAsync:
await Task.Run(async() =>
{
await LoadInitialDataAsync();
});
或者,我可以內ShowViewModel呼叫之前增加一個小的延遲:
protected async Task LoadInitialDataAsync()
{
var loadResult = await LoadSomeStuffAsync();
if (loadResult.IsBadNews)
{
await Task.Delay(1);
ShowViewModel<ErrorViewModel>();
return;
}
}
無論這些變化的產生期望的結果 - 如果在加載過程中發生錯誤事件,ErrorViewModel將顯示其視圖。
問題是,我不相信這個修復程序,因爲我不明白在諺語下有什麼問題,因此不知道這個修復程序有多強大。這似乎是一個任意時間的事情,它將在最不方便的時間在未來某個時候再次突破。
如果有人明白MvvmCross的內部結構足以幫助解決這個問題,我會很感激!
你能否提供一個repo/sample來重現這個問題?使用上面的簡化版本似乎不會導致發生此問題。 – Plac3Hold3r
我有同樣的問題,沒有人在「答案」似乎明白。問題在於,在CORE項目中,您有一些任務需要等待,並且您希望在該等待期間顯示「加載程序」?對?你找到了解決方案嗎? – Ph0b0x