4

我有一些使用服务的 ViewModel,这非常占用带宽。但是,只有在查看应用程序中的特定视图时才需要此服务。

在 MvvmCross vNext 中,我使用了ViewUnRegistered/ViewRegistered事件来检测 a 何时ViewModel显示,并且 aBaseViewModel看起来像这样:

public class BaseViewModel 
    : MvxViewModel
    , IMvxServiceConsumer
{
    public BaseViewModel()
    {
        ViewUnRegistered += (s, e) =>
        {
            if (!HasViews)
            {
                OnViewsDetached();
            }
        };

        ViewRegistered += (s, e) =>
        {
            if (HasViews)
            {
                OnViewsAttached();
            }
        };
    }

    public virtual void OnViewsAttached()
    {
        // nothing to do here
    }

    public virtual void OnViewsDetached()
    {
        // nothing to do in this base class
    }
}

然后在我的其他ViewModels中,我将继承并覆盖OnViewsAttachedOnViewsDetached启动和停止服务。

现在在 MvvmCross v3 中,这两个Event不再存在。据我了解,它们在 iOS 上也无法正常工作。v3 也有一个新的ViewModel生命周期,它具有SavedStateReloadState. 尽管据我所知,它SavedState只会在ViewModel被销毁时被调用,即使它没有显示,情况也可能并非如此。

至于检测关联的 View 是否正在显示,可以假设 View 在ShowViewModel被调用时正在显示,并且在 View 中有一些Init参数,但这里棘手的部分是检测 View 何时不再显示。关于如何实现这一目标的任何想法?

4

1 回答 1

5

在所有平台上确定 View/ViewModel 生命周期的这一领域相当棘手,尤其是当开发人员开始偏离“基本”演示模型并开始使用选项卡、拆分视图、弹出窗口、弹出窗口等时

MvvmCross v3 目前没有通用的方法来处理这个问题。

vNext 的先前代码在 ios6 移除时被破坏viewDidUnload(但无论如何通常都被错误地使用 -viewDidUnload当 ViewModel 开发人员认为它会这样时,通常不会调用它!)

仍有一个问题需要讨论未来可能的共同想法...... https://github.com/slodge/MvvmCross/issues/74


话虽如此,我最近在这种情况下使用的一些模式是:

  • 对于大多数视图模型,我什么都不做——因为这些视图模型不消耗任何资源,并且可以在系统需要内存时进行垃圾收集。

  • 对于消耗低强度资源的 ViewModel - 例如计时器滴答声,我通常使用MvxMessenger将 ViewModel 连接到这些资源。这个信使默认使用弱引用,当客户端订阅/取消订阅时,它自己会发送订阅更改消息

    使用这种方法,我可以让后台资源监控视图模型是否在内存中(并被视图引用)——这样后台资源就可以自行管理。

    ...虽然实际上经常(例如计时器滴答声)然后我让后台资源不断运行,无论 ViewModel 是否正在侦听。

  • 对于那些需要主动监控资源的罕见情况——例如,对于需要维护一个活动的蓝牙 SPP 通道的 SpheroViewModel——然后我在 ViewModel 上实现一个自定义接口——例如IActiveViewModel——然后我从每个 vie 上连接到该接口各种平台

    通常,我从 ViewDidAppear/Disappear、OnNavigatedTo/From、OnRestart/Pause 执行此操作 - 但这个确切的时间是否适合您取决于具体情况。

我怀疑,向前看,这些资源密集型视图模型将是例外而不是常态,但我希望我们会看到一些示例/食谱发布,展示一些处理它们的方法。

我们也可能会看到一些人在尝试其他持续资源的情况 - 例如,应用程序需要执行后台网络操作或需要在单个视图模型的生命周期之外(甚至可能超出应用程序)监控地理位置. 以跨平台的方式做这些事情是一个值得考虑的“有趣”模式!

于 2013-04-30T12:36:13.807 回答