什么是Notification
Notification 是一种消息,它传递给一个或多个观察对对象用来通知它们程序里发生了一个事件。
Notification这种Cocoa框架下的机制是遵循广播模式。它是一个对象初始化或处理一个程序事件时与其它任何数目的想要知道此事件的对象们交流的一种方式。
notification的接收者可以根据监听到的事件来调整它们自己的前后外观、行为和状态。
发送notification的对象不是一定要知道它的收听者都有谁。在程序的协调和聚合方面,Notification是一种很强大的机制。它减少了程序里对象之间那种强烈依赖关系的需求(这种依赖关系会减少对象的重用能力)。很对Foundation,AppKit和其它Objective-C 框架的类都定义了notification,你可以通过注册来成为观察者。
该通报机制的核心是每个进程的singleton对象,也就是我们熟知的notification center(NSNotificationCenter).当一个对象提交了一个notification,消息被传到notification center(为notification充当结算地和广播中心的角色)。
需要知道这个事件的对象无论处于应用程序的什么位置,需要通过notification center来注册,然后notification center 才能让它知道这个事件什么发生。Notification center使用同步的传递一个notification给它的观察者们,你也可以使用一个notification queue来发送一个异步的notification。
Notification 对象
一个notification 是一个NSNotification 类的实例。一个notification 对象包含了几个信息:
一个唯一的名称、发布notification的对象和(optionnel)补充信息字典(被称为用户信息字典)。当一个notification 被传递给一个观察者,notifiction对象也通过处理notification的方法参数被传递过去。
观察一个Notification
你需要获得NSNotificationCenter 的单例,然后发送一个addObserver:selector:name:object: 的消息给它,从而成为这个notification的观察者。这个消息的第二个参数,是一个selector指向当取得notification时你需要调用的一个方法。
方法的格式如下:
-(void)myNotificationHandler:(NSNotification *)notif;
发送一个Notification
在你开始发送一个Notification之前,你应该定义一个唯一的全局字符串常量来做为你的notification的名字。通常用两到三个字母的应用程序特定前缀,例如:
NSString * AMMyNotification = @"AMMyNotification";
发送一个 postNotificationName:object:userInfo: 的消息给NSNotificationCenter对象的单例,就可以post一个notification。这个方法在它发送notification至notification center之前会先创建notification对象。
下面来让我们看一个Notification的例子:
//声明一个消息,名称为chgValue,发送者是对象本身。
NSNotification *ntf = [NSNotification notificationWithName:@"chgValue" object:self];
//获得消息中心的单例,将定义好的消息发送给消息中心。
NSNotificationCenter *ntfCenter = [NSNotificationCenter defaultCenter];
//将来源是本对象,名称为chgValue的消息分发给本对象的getNtf方法。
[ntfCenter addObserver:self selector:@selector(getNtf:) name:@"chgValue" object:self];
//发送消息给消息中心
[ntfCenter postNotification:ntf];
这样一个简单的notification的发送接收就完成了。
一个实例代码:NotificationDemo
更多有关notification的资料请看这里:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043-SW1。