通知中心NSNotification与委托的异同,需要注意的要点
调度表
通知中心保存了一个调度表,表的内容包括:通知观察者(必须存在)、通知名称和通知发送者。
通知中心的调度表给观察者指定了对应的通知集,一个通知集是通知中心发出的通知的子集。
调度表入口有4种类型,如下表所示:
(英文版说明)
Notification name |
Notification sender |
Notification set specified |
Specified |
Specified |
Notifications with a particular name from a special sender. |
Specified |
Unspecified |
Notifications with a particular name by any sender. |
Unspecified |
Specified |
Notifications posted by a specific sender. |
Unspecified |
Unspecified |
All notifications. |
(中文版说明)
通知名称 |
通知发送者 |
指定的通知集 |
已指定 |
已指定 |
指定发送者发送的特定名称的通知 |
已指定 |
未指定 |
任意发送者发送的特定名称的通知 |
未指定 |
已指定 |
指定发送者发送的所有通知 |
未指定 |
未指定 |
所有的通知 |
通知与委托的异同
通知和委托一样,通知机制是实现应用程序中的对象间通讯的好工具。它使应用程序中的对象可以了解其它地方发生的改变。一般来说,一个对象注册为通知的观察者,是因为它希望在相应的事件发生后或者即将发生时进行调整。
但是通知和委托之间是不同的,这些差别也导致这两种机制应该用于不同的地方。通知模型和委托模型主要区别在于前者是广播机制,而委托是一对一的关系,每种模型都有自己的优点。
通知机制的优点:
• 发出通知的对象不需要知道观察者的标识
• 任何类都可以声明通知,其实例可以发布通知
• 通知并不限于应用程序内部的通讯;通过分布式通告,一个进程可以将发生的事件通知另一个进程。
委托机制的优点:
• 委托有机会通过将值返回给进行委托的对象来影响事件;通知则更为被动,在响应事件时只能对自身及其环境产生影响。
• 委托可以影响进行委托对象对事件的处理方式(可以任意指定方法的参数列表);通知方法的签名则是固定的。
• 委托比通知更为高效
通知与KVO
在Cocoa中,通知机制并不是观察对象状态变化的唯一选择,很多情况下甚至都不是最好的选择。KVO也可以观察其它对象的变化,在KVO中,被观察对象和观察对象直接进行通讯,不需要像通知中心这样的中间对象,因此比通知机制更为有效。
但是在某些场合中,选择通知比KVO更为合理。比如希望观察事件,而不是对象性质的改变。
通知使用注意
使用通知需要知道它对性能的影响。通知发出后,会通过本地的通知中心同步的派发给观察者对象。如果有很多观察者,或者每个观察者在处理通知时都要做很多工作,则程序就会有明显的延迟。因此使用通知的时候需要小心,不要过度、低效的使用通知。下面是一些使用通知用法的原则:
• 对应用程序应该观察的通知有所选择
• 注册通知时,要具体到通知的名称和发送的对象
• 尽可能高效的实现处理通告的方法
• 避免添加或移除很多观察者
通知机制中的类
类名 |
描述 |
NSNotification |
通知 |
NSNotificationCenter |
通知中心 |
NSDistributedNotificationCenter |
分布式通知中心(Mac OS X中可以进程间通讯) |
NSNotificationQueue |
通知队列(通知的聚结和异步发送) |