我有一些ViewModel,我使用的是服务,这是相当带宽密集的.但是,仅在查看应用程序中的特定视图时才需要此服务.
在MvvmCross vNext中,我使用ViewUnRegistered/ ViewRegisteredevents来检测何时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
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的另一个ViewModels中,我将继承此并覆盖OnViewsAttached并OnViewsDetached启动和停止服务.
现在在MvvmCross v3中,这两个Events不再存在了.据我所知,他们在iOS上也无法正常工作.v3也有一个新的ViewModel生命周期,它有SavedState和ReloadState.虽然据我所知它SavedState只会在ViewModel被破坏中被调用,但即使它没有显示也可能不是这样.
至于检测关联的View是否正在显示,可以假设View在ShowViewModel调用时显示并Init在视图中有一些参数,但这里棘手的部分是检测View何时不再显示.关于如何实现这一点的任何想法?
在所有平台上确定View/ViewModel生命周期的这个领域相当棘手,特别是一旦开发人员开始偏离"基本"演示模型并开始使用制表符,拆分视图,弹出窗口,弹出按钮等
MvvmCross v3目前没有一种常用的方法来处理这个问题.
当ios6被删除时,vNext的前一个代码被破坏了viewDidUnload(但是通常被错误地使用 - viewDidUnload当ViewModel开发人员认为它时通常不会被调用!)
还有一个问题仍在讨论可能的未来共同想法...... https://github.com/slodge/MvvmCross/issues/74
话虽如此,我最近用于此类情况的一些模式是:
对于大多数viewmodels我什么都不做 - 因为这些视图模型不消耗任何资源,只能在系统需要内存时进行垃圾回收.
对于使用低强度资源的ViewModel(如计时器滴答),我通常使用它MvxMessenger来将ViewModel连接到这些资源.默认情况下,此信使使用弱引用,当客户订阅/取消订阅时,它会发送订阅更改消息
使用此方法,我可以允许后台资源监视视图模型是否在内存中(并由视图引用) - 因此后台资源可以自行管理.
...虽然实际上经常(例如对于计时器滴答)然后我不断地运行后台资源,无论ViewModel是否正在监听.
对于那些急需资源监控的罕见情况 - 例如对于需要维护活动BlueTooth SPP通道的SpheroViewModel - 然后我在ViewModel上实现自定义接口 - 例如IActiveViewModel- 然后我从每个上的vies挂钩到该接口各种平台
通常我会从ViewDidAppear/Disappear,OnNavigatedTo/From,OnRestart/Pause执行此操作 - 但是这个确切的时间是否适合您取决于具体情况.
我怀疑,向前移动,这些资源密集型视图模型将是例外而不是常态,但我希望我们会看到一些示例/配方,它们展示了一些处理它们的方法.
我们也可能会看到一些人正在尝试其他持续资源情况 - 例如,应用程序需要执行后台网络操作,或者需要在单个视图模型的生命周期之外监视地理位置(甚至可能超出应用程序) .以跨平台的方式做这些事情是一个需要考虑的"有趣"模式!
| 归档时间: |
|
| 查看次数: |
1593 次 |
| 最近记录: |