转自 : http://mfvan.blog.163.com/blog/static/58895190201132024136497/
Cocoa 的NSNotification类的实例封装了要广播的消息,有兴趣接收信息的对象将利用Cocoa 的NSNotificationCenter类的实例注册它们自己。注册的对象称为观察者。
当将一条通知发送到通知中心时,通知中心会把该通知分发给合适的观察者。单个通知可能被广播给任意数量的观察者,把消息发送到通知中心的对象不需要知道有哪些观察者存在,或者有多少个观者者最终会接收到通知。类似的,观察者不一定需要知道通知来源于何处。
当匿名对象需要被动地观察和反应重要事件时,可以使用通知模式。与之相反,当匿名对象需要主动地影响所发生的事件时,可以使用委托模式。
- (void )addObserver:(id )observer selector:(SEL )aSelector name:(NSString *)aName object:(id )anObject;
第一个参数是要注册的观察者。第二个参数是一个选择器,用于确定在发布合适的通知时要发送给观察者的objective-c消息,选择器必须指定一个接收参数的方法,并且该参数必须是一个指向通知实例的指针。第三个和第四个参数aName:和 anObject:确定了观察者有兴趣接收哪些通知。
只有其名称与指定名称匹配的通知才会被传送给注册的观察者。
同步通知和异步通知
发布通知给NSNotificationCenter是同步的,这意味着当利用 - (void )postNotification:(NSNotification *)notification;或者任何相关的 NSNotificationCenter 方法发布通知时,在postNotification:返回对你的代码控制之前将把通知传送给所有合适的注册观察者。同步行为也意味着在你实现方法对通知做出反应时,应该留意后果。如果在通知处理代码中执行过长的操作,就会延迟其他对象对通知的接收,以及延迟返回到发布通知的代码。
一种用于启动复杂的处理以响应通知的常见技巧是使用延迟执行。在通知处理代码中,预定将来的消息并立即返回。
当你需要比仅仅延迟消息更复杂的异步行为时,可以使用Cocoa的NSNotificationQueue类。 NSNotificationQueue
实例实现了一个异步先进先出的队列。
在调用
– enqueueNotification:postingStyle:coalesceMask:forModes:
时,将把指定的通知放在队列尾部,并把控制返回给调用者。基于postingStyle,coalesceMask and modes的值,在以后某个时间NSNotificationQueue把通知发布给 NSNotificationCenter, 从那一刻起 ,由NSNotificationCenter同步地处理通知。