Xamarin 检测ViewModel';s关联视图正在显示/未显示

Xamarin 检测ViewModel';s关联视图正在显示/未显示,xamarin,mvvmcross,Xamarin,Mvvmcross,我有一些ViewModels,其中我使用的是一项带宽密集型服务。但是,只有在应用程序中查看特定视图时才需要此服务 在MvvmCross vNext中,我使用ViewUnRegistered/ViewRegistered事件来检测何时显示ViewModel,并且有一个BaseViewModel,看起来像这样: public class BaseViewModel : MvxViewModel , IMvxServiceConsumer { public BaseViewM

我有一些ViewModels,其中我使用的是一项带宽密集型服务。但是,只有在应用程序中查看特定视图时才需要此服务

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

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
    }
}
然后,在我的另一个
ViewModel
s中,我将从中继承并覆盖
OnViewsAttached
OnViewsAttached
,以启动和停止服务

现在在MvvmCross v3中,这两个
事件不再存在。据我所知,它们在iOS上也不能正常工作。v3还有一个新的
ViewModel
生命周期,它有
SavedState
ReloadState
。虽然据我所知,
SavedState
仅在
ViewModel中被调用,但该模型已被销毁,即使未显示,情况也可能并非如此


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

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

MvvmCross v3目前没有处理此问题的通用方法

当ios6删除
viewDidUnload
时,vNext中以前的代码被破坏(但通常被错误地使用-因为当ViewModel开发人员认为它会被调用时,
viewDidUnload
通常不会被调用!)

还有一个问题有待讨论未来可能的共同想法


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

  • 对于大多数viewmodels,我什么都不做——因为这些viewmodels不消耗任何资源,当系统需要回内存时,它们可以被垃圾收集

  • 对于使用低强度资源的ViewModel(如计时器信号),我通常使用
    MvxMessenger
    将ViewModel连接到这些资源。默认情况下,此messenger使用弱引用,并在客户端订阅/取消订阅时发送

    使用此方法,我可以允许后台资源监视viewmodels是否在内存中(并由视图引用),这样后台资源就可以自行管理

    。。。尽管实际上经常(例如,对于计时器滴答声),但无论ViewModel是否正在侦听,我都会让后台资源持续运行

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

    通常情况下,我会在视图中显示/消失、导航到/从、重新启动/暂停,但这一精确计时是否适用于您取决于具体情况

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

我们还可能会看到一些人正在尝试其他正在进行的资源情况,例如,应用程序需要执行后台网络操作,或者需要在单个viewmodel的生命周期之外(甚至可能在应用程序之外)监控地理位置。以跨平台的方式来做这些事情是一种“有趣”的模式。p>