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