Mar*_*one 9 design-patterns objective-c ios
在我的应用程序中,我有一个对象,它通过HTTP封装了与服务器的通信.如果服务器上有更改,此对象会使某些HTTP请求"轮询",例如会话不再有效,或者用户有新消息,等等.
应用程序的UI对象必须将自身注册到通信对象,以通过UI对象实现的协议接收通知.注册是通过以下方法完成的:
[communicationObject addObserver: self];
Run Code Online (Sandbox Code Playgroud)
并删除自己:
[communicationObject removeObserver: self];
Run Code Online (Sandbox Code Playgroud)
通信对象将观察者存储在可变数组中.在某些情况下,UI对象是在UINavigationController中推送的UIViewControllers.在这种情况下,当用户返回到父控制器时,UI控制器没有被丢弃,因为通信对象的观察者数组保留它,并且UI控制器不能从观察者中移除自己,因为从不调用dealloc方法(明显).
问题是:这个观察者 - 通知器是一个糟糕的设计模式?有一种方法可以检测到父控制器是否释放了UI控制器,而不使用viewWillDisappear方法?最好的做法是解决这类情况?
Rya*_*ona 13
如果您使用的是观察者模式,你想一个视图控制器观察值只在屏幕上时,它是一个好主意,打电话addObserver:的viewDidAppear,和removeObserver:在viewWillDisappear.这可不是设计或误用这些方法; 实际上,这是标准做法,并且很好地利用了这些视图控制器方法.
如果您希望视图控制器即使在从屏幕上删除后仍继续观察值,请首先确保这确实是您想要的.如果是,有几件事需要记住:
setup方法中,并确保在实例化和表示方式上都调用它.setup呈现视图控制器时调用的方法来实现,而不是在对象的生命周期中维持一致的状态.nil.检查其视图层次结构是否准备就绪的好方法是通过isViewLoaded属性.这里重要的是不要混淆视图控制器(或任何对象)的想法被保留在某个地方,并且它在屏幕上.这些是非常不同的事件,往往不一致.例如,如果您有一个"父"视图控制器(例如UINavigationController)管理一个或多个"子"视图控制器,则可能会同时实例化并保留多个视图控制器,而屏幕上只显示一个视图控制器.一时间
NSNotificationCenter如果您愿意,另一个处理全局事件的选项是via NSNotificationCenter,它允许您指定一个selector调用观察者,允许匿名发布通知,并允许任意事件对象(userInfo)与通知事件相关联.通过这种方式,您communicationObject可以发布通知[NSNotificationCenter defaultCenter],并且您的视图控制器将观察通知defaultCenter.您仍然可以以类似的方式添加/删除观察者对象,但您可以获得一种集中的,更强大的协调全局事件的方式.
| 归档时间: |
|
| 查看次数: |
3275 次 |
| 最近记录: |