gpt4 book ai didi

mvvmcross - ViewModel LifeCycle,它什么时候被处理掉?

转载 作者:行者123 更新时间:2023-12-03 23:51:05 24 4
gpt4 key购买 nike

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

最佳答案

没有简单的通用方法可以知道何时 dispose ViewModel - 特别是当您开始混合和匹配 ViewModel 演示样式以包括导航、选项卡、 Split View、弹出、片段、列表等时,并且随着您包含越来越多的平台

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

1. 有时我在 ViewModel 上使用了一个专门的接口(interface),并确保在每个客户端上都正确调用它。

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

  • 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 在 View 完成后可以被垃圾收集。

    这方面的一个例子是 InternetMinute 示例 - 它有一个“Tick 生成服务”,ViewModels 可以通过消息传递连接到更新 - 请参阅:
  • 服务 - https://github.com/slodge/MvvmCross-Tutorials/tree/master/InternetMinute/InternetMinute.Core/Services/Tick
  • 使用服务的 ViewModel - 通过 https://github.com/slodge/MvvmCross-Tutorials/blob/master/InternetMinute/InternetMinute.Core/ViewModels/HomeViewModel.cs

  • 您可能会认为这有点低效 - 因为即使 ViewModel 不存在也会生成 Tick 消息 - 但这只是一个很小的低效。

    3. 我考虑过使用更多的最终事件——比如 OnNavigatingFrom(BACK)和“onDestroy”以及对 UINavigationController 代表的一些“最终”检测......但我还没有理由在任何项目上“真正地”这样做。

    关于mvvmcross - ViewModel LifeCycle,它什么时候被处理掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15961664/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com