使用MvvmCross调用Web服务(或类似服务)的最佳方法

时间:2016-09-20 10:00:48

标签: c# xamarin mvvmcross

我最近一直在考虑这个问题,我希望有一个比我更了解MvvmCross的人可以对此有所了解。鉴于每个移动平台之间的细微差别,可能会有一些不同的因素会影响这个问题。但是对于这种情况,我们假设我们想要一个跨平台解决方案的最佳方法。

因此,我们假设我们有一个基本的View和ViewModel类设置。这是一个iOS示例。

查看

public partial class FirstView : MvxViewController<FirstViewModel>
{
    public FirstView(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        Request = new MvxViewModelInstanceRequest(FirstViewModel.NewInstance());
        base.ViewDidLoad();
    }
}

查看模型

public class FirstViewModel : MvxViewModel
{
    public static FirstViewModel NewInstance()
    {
        return Mvx.IocConstruct<FirstViewModel>();
    }

    public FirstViewModel()
    {
    }
}

现在在加载此View时或者在创建视图之前的某个时刻,我们想要使用我们使用依赖注入注入的服务从Web获取一些数据;因为视图的显示取决于该数据。这就是问题所在......从平台的角度来看,在MvvmCross生命周期中,最适合调用服务中的Web抓取功能。

关于平台,我会假设我们应该在视图加载后执行此操作。因为如果获取的数据不是简单的数据类型,那么在Android上使用它将是不方便的,因为由于活动之间的序列化,必须将数据保存到磁盘并在导航后检索它。

假设我们在视图加载过程中调用了Web提取。 MvvmCross架构中最好的地方在哪里发布,最接近设计范例。例如视图模型。有没有人可以推荐的生命周期方法来调用它。像Start方法之类的东西,在创建视图模型之后调用。

1 个答案:

答案 0 :(得分:4)

首先,我不明白为什么你不让平台本身实例化并执行它的ViewModel生命周期而不是使用Mvx.IocConstruct创建ViewModel的新实例。该方法不会调用ViewModel生命周期,也不会在ViewModel上调用InitStart

如果您让平台为您执行此操作,首先将使用您在使用Init时设置的参数调用ShowViewModel<T>(args)方法。

ViewDidLoad调用时,随后将调用Start方法。

这为您提供了两个地方来调用您在ViewModel的ctor中注入的服务。

如果您想要更多地控制何时下载数据,可以创建一些ICommand,您可以在任何ViewController生命周期方法中的ViewModel上调用它们。这可以在ViewWillDisappear / ViewDidDisappear方法中,也可以获取数据。

有很多方法可以做到这一点。最后,它完全取决于您,并且您无法知道用户何时决定更改为另一个视图。但是,您可以进行合格的猜测并尝试在用户实际需要之前获取数据。

有一篇很好的文章给你read here, by Rob Gibbens on how you could do Resilient network services。它描述了如何根据用户的行为推测性地获取资源,这样就可以让用户在进入View时看到它。这可以是显示缓存版本后要提取的缓存数据或新数据。

在任何情况下,我建议您停止使用Mvx.IocConstruct加载ViewModel,并让MvvmCross为您处理此问题,以便调用生命周期方法。