MonoTouch 中的弱事件模式

Posted

技术标签:

【中文标题】MonoTouch 中的弱事件模式【英文标题】:Weak Event Pattern in MonoTouch 【发布时间】:2013-02-25 21:33:10 【问题描述】:

我曾经使用 Objective-C 语言开发 ios 应用程序,并依靠dealloc 方法在我的应用程序中执行一些清理/注销任务。现在在 MonoTouch(垃圾收集)上,它不再是一个选项了。

假设我有一个UIViewController,它将View 属性的子视图添加为MyViewUIView 子类)的实例。 MyView 反过来注册自己以接收来自另一个管理器/全局对象的一些事件,以便它知道如何相应地更新自己(例如:onlineProfilesManager.Refreshed += () => <update UI with the new state>;)。

只要MyView 在屏幕上,一切都很好。但是我必须知道它何时从屏幕上删除,以便我可以从事件处理程序中取消注册 MyView

在 Obj-C 中,这可以简单地在 dealloc 方法中完成,因为当屏幕更改时,UIViewController 被释放 --> MyView 从它的超级视图中删除,然后调用 MyView dealloc 方法。

在 Monotouch 中,我不再有这种“确定性”流程。我尝试在 UIViewControllerMyView 析构函数中放置一些打印语句,但它们从未被调用(原因是因为 MyView 仍为事件处理程序注册,因为我不知道何时/如何取消注册它,它永远不会被释放)。

有谁知道在 MonoTouch 中处理这种情况的“模式”是什么?我认为我错过了一个基本概念,并且在开发我的应用程序时遇到了麻烦。

提前致谢。


编辑 我正在编辑我的问题,因为看起来我的问题的解决方案是使用 Weak Event Pattern,但我没有找到 MonoTouch 平台的实现。

有人知道我如何在 MonoTouch 中使用Weak Event Pattern 吗?

【问题讨论】:

尝试覆盖Dispose。不过,这可能不适用于您的情况(听起来)。告诉我。 如果他在 MyView 上覆盖 Dispose,它可能不起作用,但如果他断开 MyViewController 的 Dispose 覆盖中的处理程序,它应该可以工作。 @jstedfast @Greg Munn(下)建议我断开/连接ViewWillDisappearViewWillAppear 方法对中的事件处理程序。类似的情况是在 ConstructorDispose 方法上执行此操作?如果UIViewController 被事件处理程序捕获,是否会调用Dispose 【参考方案1】:

处理事件的最佳方法是在 ViewWillDisappear 中取消注册它们并在 ViewWillAppear 中注册它们。这意味着您不能使用匿名方法,因为您没有对方法的引用来取消注册它。

如果这不符合您的需要,您可以执行类似于 http://sgmunn.com/blog/2012/05/non-gcd-event-handlers/ 的操作

干杯。

【讨论】:

ViewWillAppearViewWillDisappear 听起来很有趣,但是如果 ViewController 想要呈现一个 Modal View Controller(即:检索用户信息)并使用事件处理程序接收结果怎么办?在呈现模态视图控制器时,根视图控制器将调用它的ViewWillDisappear方法,因此将为此类事件取消注册。这是重点:我不知道要重写哪个方法来执行注册/取消注册任务 ViewDidUnload 也不是一个选项(它已过时并且不保证在视图控制器关闭时总是被调用) @EduardoCoelho 视图 A 以模态方式呈现视图 B -> 在这种情况下,您必须保留一个标志以了解 B 是否是模态的。您还可以检查 PresentedViewController 的值(它将是模态的)。 我创建了一个带有抽象 UIViewController 子类的要点,该子类用作注册/注销 UIViewController 子类中事件的“模式”。 gist.github.com/eduardocoelho/5044439你怎么看?【参考方案2】:

如果你正在寻找弱事件,你可以试试我的“Messenger”实现here。

它的灵感来自 TinyIoC 中可用的内容,但我重新实现了它,因此它使用了更少的反射等。

【讨论】:

以上是关于MonoTouch 中的弱事件模式的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch:了解委托机制模式

iOS 上 MonoTouch 中的多点触控

Monotouch、UIPopover 和获取事件

从 UITextField 单击事件 MonoTouch 在 UIDatePicker 中选择日期

用于 lambda 的弱事件处理程序模型

monotouch 在横向模式和纵向模式下旋转