1

这个问题是我上一个问题的后续/“第二次尝试” 。

我正在使用 MvvmCross 框架构建一个跨平台的移动应用程序,我想使用Messenger插件来接收从我的代码中其他地方发布的事件通知。

我试图在ctor如下添加订阅:

public class MyViewModel : BaseViewModel, IMyViewModel
{
    private MvxSubscriptionToken _showMsgToken;

    public MyViewModel ()
    {
        _showMsgToken = MvxMessenger.Subscribe<ShowMsg>(message => onShowNavigation(), MvxReference.Weak);
    }
    private void onShowNavigation()
    {
        //Do Stuff
    }
}

现在,当我导航到此 ViewModel 时,一切正常并收到通知。
但是,当我离开并返回此 ViewModel 时,我可以看到 Subscription 正在向MvxMessengersubscriptions 属性添加另一个条目,导致onShowAdsNavigation()每个新事件触发两次。

那么,如何订阅 ViewModel 中的事件呢?或者也许我需要找到一种方法来取消订阅事件?

4

1 回答 1

1

如果您需要主动取消订阅消息,那么您可以通过在您的视图中捕获生命周期事件然后使用这些来驱动您的视图模型来做到这一点。这是你的代码——你可以做你喜欢的事。

有关这方面的一些选项,请参阅ViewModel LifeCycle,它何时被处置?


我通常不会为订阅的主动管理而烦恼。相反,我依赖于 View 将从 UI 中删除的事实,因此它和它的 ViewModel 将在之后的某个时间从内存中删除。当这种情况发生时,我知道订阅管理将自动发生 - 当 View 和 ViewModel 收集垃圾时,订阅也将在不久之后被清理。我知道 Messenger 中使用的弱引用将意味着订阅会自行清理。

为了证明这一点,请尝试https://github.com/slodge/MessengerHacking - 它有一个按钮可以强制 GC 发生。

如果这对您的应用来说“不够好*”,请参阅上面的“如果您需要积极...”。

于 2013-06-05T15:11:18.847 回答