消息中心
什么事消息中心呢?个人理解为他就像一个广播,他发送一个消息,在所有添加监听的地方都能收到此信息,并根据相应的需求来完成动作,范围更广大美功能相对而言也更强大。每一个应用程序中都会有一个通知中心用来专门负责协助不同对象间的消息通信。
解决的问题
举个例子来说明,比如说我有五个View每个View上有一个按钮,现在我想点击一个A页面上的按钮然后他会隐藏,同时其他四个页面B,C,D,E上的按钮也要隐藏。这时候我们就可以在点击A页面的时候向通知中心发布一个通知,然后B,C,D,E接受到这个通知的时候就会把按钮隐藏。这时候我们可以称A为发布通知者,B,C,D,E可以称为通知接受者。
消息机制的步骤:
添加消息中心监听:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setUserInfo:)
name:@"SetUserInfo" object:nil];
addobserver:监听者,即谁要接受这个通知。(self 自己)
selector:收到通知后,回调监听的方法,并把对象当作参数传入。(setUserInfo)
name:通知的名称。如果为空。那么无论通知的名称是什么,监听者都会收到这个通知 userInfo:<#(NSDictionary *)#>];
发送消息
[[NSNotificationCenter defaultCenter]postNotificationName:(NSString *)
object:(id)
userInfo:(NSDictionary *)];
postNotficationName:消息通知的名字
object;消息的发送者
回调函数的处理:
- (void) setUserInfo:(NSNOtification*) aNotification
{
doSomeThing;
}
观察者注销
[[NSNotificationCenter defaultCenter] removeObserver:(id)
name:(NSString *)
object:(id)]
可以说在iOS引入ARC以后,我们不注销也不会出错,但是注销有利于性能跟内存。所以尽量注销。
与delegate的区别
看见一篇博客上写的非常好所以就直接移植过来。可以一起参考
delegate的优势:
- 非常严格的语法,所有的时间必须在delegate协议中有清晰的定义。
- 如果delegate中的一个方法没有实现那么就会出现编译警告或错误。
- 协议必须在controller的作用域范围内定义。
- 在一个应用中的控制流程是可跟踪的并且是可识别的。
- 在一个控制器中可以定义多个不同的协议,每个协议有不同的delegates
- 没有第三方对象要求保持/监视通信过程。
- 能够接受调用方法的返回值。这意味着得了噶特能够提供反馈信息给cpontroller。
delegate的不足:
- 需要定义很多的代码:1)协议定义。2)controller的delegate的属性。3)在delegate本身中实现delegate方法。
- 在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法会出现内存crash。
- 在一个controller中有多个delegate对象,并且delegate遵守一个协议,但是还是很难告诉多个对象同一个事件,不过有可能。
notifition的优势:
- 不需要编写多少代码,实现比较简单。
- 对于一个发出的通知,多个对象能够能做出反应,即一对多实现简单。
- controller能够传递context对象(dictionary), context对象携带了关于发送通知的自定义的信息
notifition的不足:
- 在编译期不会检查通知是否能够被观察者正确的处理。
- 在释放注册的对象时,需要在通知中心中取消注册。
- 在调试的时候应用的工作以及控制过程难跟踪。
- 需要第三方对喜爱的那个来管理conctroller与观察者对象之间的联系。
- ccontroller和观察者需要提前知道通知明晨,UserInfo dictionary keys。如果这些没有在工作区间定义那么会出现不同步的情况。
- 通知发出后,controller不能从观察者获得任何的反馈信息。
感谢那位大神的博客写的这么详细,我就偷偷的引用来莫怪。其实在实际编码中我门还是需要不断的积累经验才能很好的区分,现在只是知道知识点还是不够的腰多写多练。共勉。