我正在开发我的第一个MvvmCross项目,我正在使用Splash Screen从sqlite数据库获取一些用户数据,并根据是否有数据启动Login或Main View Model。 然后我想将这些数据发送到MainViewModel。我想知道是否可以制作以及如何制作。 这是我的MvxSplashScreenActivity代码:
[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashScreen : MvxSplashScreenActivity
{
protected override void OnResume()
{
base.OnResume();
Task startupWork = new Task(() => { SimulateStartup(); });
startupWork.Start();
}
async void SimulateStartup()
{
Task<Core.Models.TrackrUserData> result = Mvx.Resolve<RepositoryService>().GetUserDataAsync();
await Task.Delay(2000);
Core.Models.TrackrUserData userData = result.Result;
if(userData != null){
await GetProjects(userData);
await Task.Delay(1000);
}else{
await Task.Delay(1000);
}
}
async Task<bool> GetProjects(Core.Models.TrackrUserData login)
{
var apiService = new ApiService();
var respuesta = await apiService.GetProjects(login.IdUser.ToString(), login.ActiveTeamId.ToString(), login.Jwt);
await Mvx.Resolve<RepositoryService>().DeleteProjects();
var projectsSaved = SaveProjects(respuesta);
return true;
}
async Task<bool> SaveProjects(List<ProjectGetResponse> respuesta)
{
foreach (var item in respuesta)
{
await Mvx.Resolve<RepositoryService>().CreateProject(new Project
{
Id = item.Id,
Name = item.Name
});
}
return true;
}
}
提前致谢!
答案 0 :(得分:3)
我不建议您在View级别执行所有异步工作。业务逻辑和繁重的工作不是View的关注点。想一想:如果您要创建iOS版本的App,您还需要复制该平台上的所有代码......
您可以利用MvvmCross提供的MVVM实现,并在Core级别执行所有操作。
为此,您可以按照以下步骤操作:
1)创建一个派生自MvxNavigationServiceAppStart。
的类2)覆盖Start方法并确保在方法结束之前导航到ViewModel(在您的情况下为MainViewModel)。
3)在导航之前,您可以执行所需的所有操作。但是如果你要做异步/等待,你最终会得到一个async void Start
方法......这并不是很好。所以我的建议是存储一个简单的值,以便使用this plugin之类的内容做出初步决策并快速加载。
4)之后,您可以在初始ViewModel上完成所有繁重的工作(也许MainViewModel
?)。
最终提示:您应该考虑在构造函数中使用依赖注入加载所有依赖项,而不是通过IoC容器解析它们。