ViewModel LifeCycle什么时候被处理?

时间:2013-04-12 01:32:49

标签: mvvmcross

在mvvmcross v3 ViewModel

public class TimerViewModel : MvxViewModel
{
    System.Timers.Timer timer;

    public TimerViewModel()
    {
        timer = new System.Timers.Timer(500f);

        timer.Elapsed += HandleTimerElapsed;

        timer.Start();

    }

    void HandleTimerElapsed (object sender, ElapsedEventArgs e)
    {
        Debug.Log( "Time Elapsed" );
    }
}

由于MvxViewModel没有实现IDisposable,我应该在哪里放置以下代码?

timer.Stop();
timer.Elapsed += HandleTimerElapsed;

我发现mvvmcross代码有一些MvxWeakEventSubscription,用于解决我的问题吗?

1 个答案:

答案 0 :(得分:10)

没有简单的通用方法来了解何时dispose ViewModel - 特别是一旦开始混合和匹配ViewModel演示样式以包括导航,制表符,拆分视图,弹出窗口,片段,列表等,并且包括越来越多的平台

由于这个原因,我过去关闭定时器等几种方式的原因是:

1。有时我在ViewModel上使用了专门的界面,我确保在每个客户端上都适当调用它。

例如,我使用:

完成了一些“页面”级视图的启动/停止
  • Android中的OnPause / OnResume
  • Windows中的OnNavigatedTo / OnNavigatingFrom
  • iOS中的ViewDidAppear / ViewWillDisappear

我已经考虑过将此作为一种通用模式添加(记录在https://github.com/slodge/MvvmCross/issues/74中) - 但到目前为止我还没有将其添加到v3中,因为我认为它会导致过多的误解用户 - 最好让他们在需要的极少数情况下这样做。

更新:我在博客上发布了相关内容并发布了一个示例 - 请参阅http://slodge.blogspot.co.uk/2013/11/n42-is-my-viewmodel-visible-can-i-kill.html

2. 有时候我刚刚通过MvvmCross Messenger使用了事件聚合 - 我使用了它基于WeakReference的固有消息传递来确保ViewModel可以在垃圾回收时使用视图已经完成了。

这方面的一个例子是InternetMinute示例 - 它有一个'Tick生成服务',ViewModels可以通过消息传递连接到更新 - 请参阅:

您可能会认为这效率稍低 - 因为即使ViewModel不存在也会生成Tick消息 - 但它只是效率很低。

3。我考虑过使用更多的最终事件 - 例如OnNavigatingFrom(BACK)和'onDestroy'以及UINavigationController委托上的一些'最终'检测...但我没有有理由在任何项目中“真实地”做这件事。