2013-04-30 54 views
3

我有一些ViewModel,我使用的服务是相当带宽密集型的。但是,只有在查看应用程序中的特定视图时才需要此服务。检测ViewModel的关联视图是否显示/不显示

在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的I只想继承这并覆盖OnViewsAttachedOnViewsDetached以启动和停止该服务。

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

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

回答

5

在所有平台上确定视图/视图模型生命周期的这个区域是相当棘手的,特别是一旦开发商开始从“基本”演示模型偏离,并开始使用标签,splitviews,弹出窗口,弹出按钮等

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

时iOS6的去除viewDidUnload从vNext上面的代码被打破(但通常使用不当呢! - 为viewDidUnload没有得到普遍调用时视图模型开发者认为这将是)

有一个问题打开仍在讨论今后可能的共同想法... https://github.com/slodge/MvvmCross/issues/74


随着中说,一些我最近使用这种类型的情况的模式是:

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

  • 对于消耗低强度资源的ViewModels(例如计时器滴答),我通常使用MvxMessenger将ViewModel连接到这些资源。此信使默认使用弱引用,当客户订阅/取消订阅时,它本身发送subscription change messages

    使用此方法,我可以允许后台资源监视视图模型是否在内存中(并且由视图引用) - 因此背景资源可以管理自己。

    ...虽然实际上很经常(例如,对于计时器滴答),但是我离开后台资源不断运行,无论ViewModel是否在监听。

  • 对于那些需要资源监控的罕见情况 - 例如,对于需要维护一个活动的BlueTooth SPP通道的SpheroViewModel - 然后我在ViewModel上实现一个自定义接口 - 例如IActiveViewModel - 然后我勾到从抢答该接口上的每个不同的平台

    一般来说,我做到这一点从ViewDidAppear的/消失的OnNavigatedTo /发件人,OnRestart /暂停 - 但确切时间是否为你工作依赖于情况。

我怀疑,向前移动,这些资源密集型的ViewModels将是例外,而不是常态,但我希望我们会看到一些样品/张贴的食谱其中展示的处理他们一些方法。

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