我目前有一个视图(Android Fragment)和相应的ViewModel。现在我想在ViewModel中引发一个事件,以便View可以订阅它。
最好的方法是什么?我听说常规C#事件(委托)可能会导致内存泄漏?这就是WeakSubscribe函数的原因吗?如何将其绑定到事件?
我目前有一个视图(Android Fragment)和相应的ViewModel。现在我想在ViewModel中引发一个事件,以便View可以订阅它。
最好的方法是什么?我听说常规C#事件(委托)可能会导致内存泄漏?这就是WeakSubscribe函数的原因吗?如何将其绑定到事件?
为了防止视图内存泄漏,您订阅的每个事件都需要取消订阅,可以使用WeakSubscribe
或像往常一样订阅事件。
一个常见的场景是在以下情况下进行订阅:
OnResume()
ViewWillAppear()
然后在以下情况下取消订阅:
OnPause()
ViewWillDisappear()
如果您想要“监听”ViewModel属性更改,则可以使用WeakSubscribe
:
private IDisposable _selectedItemToken;
_selectedItemToken = ViewModel.WeakSubscribe(() =>
ViewModel.SelectedItem, (sender, eventArgs) => {
// do something
});
请注意,
WeakSubscribe()
返回一个MvxWeakEventSubscription,它也是一个IDisposable
。您需要在视图中保存该订阅的引用,并在不再需要时进行处理。 保留该引用有两个原因:
- 稍后可以处理它
- 如果不保留它,您的lambda事件处理程序可能无法始终正常工作
稍后...
_selectedItemToken?.Dispose();
如果您只需要订阅ViewModel中的其他类型事件(而不是属性更改),则实际上不需要使用WeakSubscribe
。您可以像处理任何对象一样,向ViewModel添加事件监听器。
ViewModel.AnEvent += YourDelegate;
后来...
ViewModel.AnEvent -= YourDelegate;
不要忘记最后一步。这将防止内存泄漏。就像我说的,Android的
OnPause()
和iOS的ViewWillDisappear()
是做这件事情的好地方。
这样,当视图被释放时,你的ViewModel就不会停留在内存中,因此你的视图可以正确地被垃圾回收。