MonoTouch 中的弱事件模式
Posted
技术标签:
【中文标题】MonoTouch 中的弱事件模式【英文标题】:Weak Event Pattern in MonoTouch 【发布时间】:2013-02-25 21:33:10 【问题描述】:我曾经使用 Objective-C 语言开发 ios 应用程序,并依靠dealloc
方法在我的应用程序中执行一些清理/注销任务。现在在 MonoTouch(垃圾收集)上,它不再是一个选项了。
假设我有一个UIViewController
,它将View
属性的子视图添加为MyView
(UIView
子类)的实例。 MyView
反过来注册自己以接收来自另一个管理器/全局对象的一些事件,以便它知道如何相应地更新自己(例如:onlineProfilesManager.Refreshed += () => <update UI with the new state>;
)。
只要MyView
在屏幕上,一切都很好。但是我必须知道它何时从屏幕上删除,以便我可以从事件处理程序中取消注册 MyView
。
在 Obj-C 中,这可以简单地在 dealloc
方法中完成,因为当屏幕更改时,UIViewController
被释放 --> MyView
从它的超级视图中删除,然后调用 MyView
dealloc 方法。
在 Monotouch 中,我不再有这种“确定性”流程。我尝试在 UIViewController
和 MyView
析构函数中放置一些打印语句,但它们从未被调用(原因是因为 MyView
仍为事件处理程序注册,因为我不知道何时/如何取消注册它,它永远不会被释放)。
有谁知道在 MonoTouch 中处理这种情况的“模式”是什么?我认为我错过了一个基本概念,并且在开发我的应用程序时遇到了麻烦。
提前致谢。
编辑 我正在编辑我的问题,因为看起来我的问题的解决方案是使用 Weak Event Pattern,但我没有找到 MonoTouch 平台的实现。
有人知道我如何在 MonoTouch 中使用Weak Event Pattern 吗?
【问题讨论】:
尝试覆盖Dispose
。不过,这可能不适用于您的情况(听起来)。告诉我。
如果他在 MyView 上覆盖 Dispose,它可能不起作用,但如果他断开 MyViewController 的 Dispose 覆盖中的处理程序,它应该可以工作。
@jstedfast @Greg Munn(下)建议我断开/连接ViewWillDisappear
和ViewWillAppear
方法对中的事件处理程序。类似的情况是在 Constructor
和 Dispose
方法上执行此操作?如果UIViewController
被事件处理程序捕获,是否会调用Dispose
?
【参考方案1】:
处理事件的最佳方法是在 ViewWillDisappear 中取消注册它们并在 ViewWillAppear 中注册它们。这意味着您不能使用匿名方法,因为您没有对方法的引用来取消注册它。
如果这不符合您的需要,您可以执行类似于 http://sgmunn.com/blog/2012/05/non-gcd-event-handlers/ 的操作
干杯。
【讨论】:
ViewWillAppear
和 ViewWillDisappear
听起来很有趣,但是如果 ViewController 想要呈现一个 Modal View Controller(即:检索用户信息)并使用事件处理程序接收结果怎么办?在呈现模态视图控制器时,根视图控制器将调用它的ViewWillDisappear
方法,因此将为此类事件取消注册。这是重点:我不知道要重写哪个方法来执行注册/取消注册任务
ViewDidUnload
也不是一个选项(它已过时并且不保证在视图控制器关闭时总是被调用)
@EduardoCoelho 视图 A 以模态方式呈现视图 B -> 在这种情况下,您必须保留一个标志以了解 B 是否是模态的。您还可以检查 PresentedViewController 的值(它将是模态的)。
我创建了一个带有抽象 UIViewController 子类的要点,该子类用作注册/注销 UIViewController 子类中事件的“模式”。 gist.github.com/eduardocoelho/5044439你怎么看?【参考方案2】:
如果你正在寻找弱事件,你可以试试我的“Messenger”实现here。
它的灵感来自 TinyIoC 中可用的内容,但我重新实现了它,因此它使用了更少的反射等。
【讨论】:
以上是关于MonoTouch 中的弱事件模式的主要内容,如果未能解决你的问题,请参考以下文章