我的ViewModel中有一个排序问题,该问题似乎与线程有关,但我无法弄清楚我们出了什么问题或我的“修复”是如何修复它的.
我有一个ViewModel,需要调用一个异步方法来加载其初始数据.我从MvvmCross自动调用的Init方法调用异步方法.如果由于某种原因加载失败,我想显示一个Error屏幕,但是在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日志告诉我在初始ViewModel上调用ShowViewModel后立即在ErrorViewModel上调用它,但是仅显示初始View,而不显示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的内部结构可以对此提供帮助,我将不胜感激!
解决方法:
初始化方法应该做的很少. Init通常用于复制一些传递到ShowViewModel< TViewModel>()中的导航参数. Start方法用于执行ViewModel启动,例如调用LoadInitialDataAsync.请查看App Lifecycle documentation以获取更多信息.