ViewModel生命周期,它何时被销毁?

13

在 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,它是用来解决我的问题的吗?


抱歉 - 我无法理解您的情况。如果您提供更多详细信息,我会尝试帮助您。也许提供一个需要处理的完整示例视图和ViewModel会更好。 - Stuart
1个回答

10

对于何时“dispose” ViewModel 没有易于普适的方式 - 特别是一旦您开始混合和匹配 ViewModel 呈现样式以包括导航、选项卡、分割视图、弹出窗口、片段、列表等,以及您包含越来越多的平台。

因此,我过去关闭计时器等东西的几种方法是:

1. 有时我会在 ViewModel 上使用专门的接口,并确保在每个客户端上适当地调用它。

例如,我曾经使用以下方法启动/停止“页面”级别的 Views:

  • 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生成服务”,ViewModel 可以通过消息连接到它以获取更新 - 请参见:

虽然即使没有视图模型,也会生成Tick消息,但您可能认为这有点低效,但这只是一个小的低效率。

3.我考虑使用更多最终事件——例如OnNavigatingFrom(BACK)、'onDestroy'以及UINavigationController代理中的一些'final'检测...但我尚未在任何项目上真正实现过这样做的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接