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

本文关键字:服务 方法 最佳 MvvmCross 调用 web 使用 | 更新日期: 2023-09-27 18:08:03

我最近一直在考虑这个问题,我希望比我自己更了解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()
    {
    }
}

现在,在加载该视图时,或者在创建视图之前的某个时刻,我们希望使用我们使用依赖注入注入的服务从web获取一些数据;因为视图的显示取决于该数据。问题就在这里。。从平台的角度来看,在MvvvmCross生命周期中,此时将是调用服务中的web获取函数的最合适位置。

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

因此,假设我们在视图加载过程中调用了webfetch。MvvvmCross架构中最适合激发它的地方在哪里,这最符合设计范式。例如视图模型。有没有什么生命周期方法可以推荐给内部调用。类似于在创建视图模型后调用的Start方法。

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

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

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

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

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

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

有很多方法可以做到这一点。最终,这完全取决于您,您不可能知道用户何时决定更改为另一个视图。然而,您可以进行合格的猜测,并在用户真正想要数据之前尝试获取数据

Rob Gibbens写了一篇关于如何提供弹性网络服务的好文章,你可以在这里阅读。它描述了如何根据用户正在做的事情推测性地获取资源,并通过这种方式在用户进入视图时为其准备好一些内容。这可能是缓存的数据,也可能是显示缓存版本后获取的新数据。

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