繁体   English   中英

用于管理观察者的Objective-C设计模式

[英]Objective-C design pattern for managing observers

在我的应用程序中,我有一个对象,它通过HTTP封装了与服务器的通信。 如果服务器上有更改,此对象会使某些HTTP请求“轮询”,例如会话不再有效,或者用户有新消息,等等。

应用程序的UI对象必须将自身注册到通信对象,以通过UI对象实现的协议接收通知。 注册是通过以下方法完成的:

[communicationObject addObserver: self];

并删除自己:

[communicationObject removeObserver: self];

通信对象将观察者存储在可变数组中。 在某些情况下,UI对象是在UINavigationController中推送的UIViewControllers。 在这种情况下,当用户返回到父控制器时,UI控制器没有被丢弃,因为通信对象的观察者数组保留它,并且UI控制器不能从观察者中移除自己,因为从不调用dealloc方法(明显)。

问题是:这个观察者 - 通知器是一个糟糕的设计模式? 有一种方法可以检测到父控制器是否释放了UI控制器,而不使用viewWillDisappear方法? 最好的做法是解决这类情况?

最佳实践

如果您使用的是观察者模式,你想一个视图控制器屏幕上只有同时观察值,它是一个好主意,打电话addObserver:viewDidAppearremoveObserver:viewWillDisappear 这可不是设计或误用这些方法; 实际上,这是标准做法,并且很好地利用了这些视图控制器方法。

如果您希望视图控制器即使在从屏幕上删除仍继续观察值,请首先确保这确实是您想要的。 如果是,有几件事需要记住:

  • 特别是,请确保您的视图控制器已设置为具有相同的状态(如果它先前存在并且刚刚被带到屏幕,就像它从头开始实例化并立即被带到屏幕上一样)。 这样做的一个不错的方法(通常是我在自己的项目中所做的)是将所有设置代码保存在setup方法中,并确保在实例化和演示文稿中都调用它。
  • 此外,请务必避免在后台进行昂贵的无关计算。 通常,这可以通过依赖于在呈现视图控制器时调用的setup方法来实现,而不是在对象的生命周期中维持一致的状态。
  • 最后,请务必记住,视图控制器在屏幕上只有连接的出口(视图/子视图,通常统称为视图层次结构)。 当它关闭但保留时,这些都是nil 检查其视图层次结构是否就绪的好方法是通过isViewLoaded属性。

保留v。演示文稿

这里重要的是不要混淆视图控制器(或任何对象)的想法被保留在某个地方,并且它在屏幕上 这些是非常不同的事件,往往不一致。 例如,如果您有一个“父”视图控制器(例如UINavigationController )管理一个或多个“子”视图控制器,则可能会有多个视图控制器同时实例化并保留,而屏幕上只显示一个一次。

更好的是: NSNotificationCenter

如果您愿意,另一个处理全局事件的选项是通过NSNotificationCenter ,它允许您指定一个selector来调用观察者,让通知匿名发布,并允许任意事件对象( userInfo )与通知事件相关联。 通过这种方式,您的communicationObject会将通知发布到[NSNotificationCenter defaultCenter] ,您的视图控制器将在defaultCenter上观察通知。 您仍然可以以类似的方式添加/删除观察者对象,但是您可以获得一种集中的,更强大的协调全局事件的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM