通知(Notification)是一种发送给一个或者多个观察者,用来通知其在程序中发生了某个时间的消息。通知机制遵循的时一种广播的模式。它是一种程序中时间的发起者或者是处理这和其他想要知道该时间的对象的沟通的一种方式。消息的接收者,也就是观察者响应该时间来变换自己的UI、行为或是状态。发送通知的对象没有必要知道这些观察者都是谁。因此,通知是一种在程序中可以获得高校协作同时保持高内聚性的机制。他减少了程序中对象相互之间的强依赖性。
通知机制的核心就是一个进程中单一实例的对象,被叫做通知中心(NSNotificationCenter)。当一个对象发布一个通知时,通知就会先被发布到通知中心。通知中心的作用相当于是交流所,作为通知的广播中心。程序中其他需要感知时间的对象通过向通知中心注册就可以达到在时间发生时被通知中心及时通知得到目的。通知中心是可以以同步的方式向其观察者发送通知,也是可以通过使用通知队列(NSNotificationQueue)来异步地发送通知。
iOS中,通知分为系统通知、自定义通知、本地通知、推送通知。
1.系统通知:系统通知是cocoa框架定义好的通知,开发者只需要在通知中心区注册通知,至于什么时候发送通知,由系统决定。系统定义好了这些通知的发送时机,一般由通知的名称体现。
下面是iOS系统通知的示例代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinish:)name:UIKeyboardWillShowNotification object:nil];
以上代码中:
[NSNotificationCenter defaultCenter]是创建一个通知中心对象,它是一个单例。
addObserver:观察者。
selector:方法选择器,当接收到通知时执行()内的方法。
name:所要监听的关键词(由系统定义)。
object:发送通知的对象,这里置为nil;
用完系统通知后,要在通知中心移除。一般放在dealloc方法(对象销毁时自动执行的方法)中移除(重写dealloc方法),也可以放在需要的地方移除。
代码示例:
-(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];}
(重写dealloc方法,在对象销毁时从通知中心移除名为“UIKeyboardWillShowNotification”的系统通知)
2.自定义通知
自定义通知是指开发人员自己来定义通知。自定义通知的一般步骤:
1.注册监听者。
2.创建并发送通知。
3.移除监听者。
其中,第一步和第三步与系统通知的使用方法是一样的,不同的是系统通知是系统发送的,自定义通知是开发者自定义发送的。
示例代码:
// 创建并发送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"News" object:nil userInfo:@{}];
以上代码中:
Name:要发送的通知的名字;
object:发送通知的对象,这里置为nil;
userInfo:要发送的通知的内容,字典形式。
同系统通知一样,使用完毕后要在对象销毁时或者在需要的地方从通知中心移除。
3.本地通知
// 待添加
4.推送通知
// 待添加
通知和KVO的区别:
KVO只能监听属性的变化,通过NSString类型的属性名来实现。实现了自动监听,当属性值变化是,会自动通知观察者,不再添加代码了。但是观察者得持有被观察者的引用,以便被观察者注册观察者,耦合性太高,不利于代码的维护。
NSNotificatin比较灵活,可以监听的内容不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。但是需呀被观察者手动发送通知,观察者注册监听后才能进行响应,比KVO多了发送通知的一部。但是注册监听不需要被观察者的引用,没有耦合性,利于代码维护。
使用通知时常见的错误:
1.通知名称填写不正确,可以在.pch文件中声明宏,以便填写名称时自动填写。
2.忘记从通知中心移除。