NSNotificationCenter
对象 (通知中心) 提供一种在task内广播信息的机制,它基本上是一个通知调度表。通过调用addObserver:selector:name:object:方法来注册一个对象来接收通知中心的通知,此方法的每个调用指定了通知的一个集合,因此,对象可以调用多次该函数以注册为不同通知集合的观察者。
当某个对象post一个通告,它会发送一个NSNotification对象到通告中心,通告中心于是会以发送特定通告消息,并传递通告为唯一参数的方式来通知符合注册标准规定的观察者。
通告中心维持一个通告调配表,该表为特定观察者指定一个通过集。
一个通告集是发送到通告中心的通告的子集,每个表入口包含三个项目:
通告观察者
通告名
通告发送者
Table 1 shows the four types of dispatch table entries and the notification sets they specify. (This table omits the always present notification observer.)
Notification name | Notification sender | Notification set specified |
---|---|---|
Specified | Specified | Notifications with a particular name from a specific sender. |
Specified | Unspecified | Notifications with a particular name by any sender. |
Unspecified | Specified | Notifications posted by a specific sender. |
Unspecified | Unspecified | All notifications. |
Table 2 shows an example dispatch table with four observers.
Observer | Notification name | Notification sender |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When notifications are posted to the notification center, each of the observers in Table 2 are notified of the following notifications:
-
observerA
: Notifications namedNSFileHandleReadCompletionNotification
. -
observerB
: Notifications sent byaddressTableView
. -
observerC
: Notifications namedNSWindowDidChangeScreenNotification
sent bydocumentWindow
and notifications sent byaddressTableView
. -
observerD
: All notifications.
观察者接收通告的顺序是没有定义的。有可能发送对象和观察者对象是同一个对象。
通告中心同步传递通告给观察者,换句话说,postNotification:
方法会一直等到所有观察者接收和处理完通告后才返回。要异步发送通告可以使用NSNotificationQueue。在多线程应用中,通告总是在post通告的线程中传递,但可能与观察者注册自己不是同一个线程。
注意:通告中心不会保持观察者的引用,因此,必须确保在观察者销毁前反注册它们(usingremoveObserver:
or removeObserver:name:object:
),否则会产生运行时错误。
每个task都有一个默认的通过中心,通常不需要自己创建。NSNotificationCenter对象只能在单个task内传递通告。如果你想post通告到其它task或者从其它通告接收到通告,可以使用NSDistributedNotificationCenter对象。