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

4

1 回答 1

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 代表的一些“最终”检测……但我还没有理由在任何项目上“真正地”这样做。

于 2013-04-15T18:42:37.363 回答