使用NSNotificationCenter时要注意的地方

在使用 NSNotificationCenter时,需要注意的一个地方:往NSNotificationCenter加Observer的方式是追加式的,也就是说总是在原有的内容上再添加。举个例子来说,会清楚点,假设下面的调用被执行了两次,则当someObject2发出一条名称为@“NotificationName”的通知后,someObject1会先后得到两条这种通知,然后先后执行两次someMethod中的操作。

    [[ NSNotificationCenter defaultCenter] addObserver:someObject1

      selector:@selector(someMethod)

  name:@“NotificationName”

object:someObject2];

 

 

附 官方文档对NSNotificationCenter的解说:

 

  An NSNotificationCenter object (or simply, notification center) provides a mechanism for broadcasting information within a program. AnNSNotificationCenter object is essentially a notification dispatch table.

Objects register with a notification center to receive notifications (NSNotification objects) using theaddObserver:selector:name:object: or addObserverForName:object:queue:usingBlock: methods. Each invocation of this method specifies a set of notifications. Therefore, objects may register as observers of different notification sets by calling these methods several times.

When an object (known as the notification sender) posts a notification, it sends an NSNotification object to the notification center. The notification center then notifies any observers for which the notification meets the criteria specified on registration by sending them the specified notification message, passing the notification as the sole argument.

A notification center maintains a notification dispatch table which specifies a notification set for a particular observer. A notification set is a subset of the notifications posted to the notification center. Each table entry contains three items:

  • Notification observer: Required. The object to be notified when qualifying notifications are posted to the notification center.

  • Notification name: Optional. Specifying a name reduces the set of notifications the entry specifies to those that have this name.

  • Notification sender: Optional. Specifying a sender reduces the set of notifications the entry specifies to those sent by this object.

Table 1 shows the four types of dispatch table entries and the notification sets they specify. (This table omits the always present notification observer.)

 

Table 1  Types of dispatch table entries

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.

 

Table 2  Example notification dispatch table

Observer

Notification name

Notification sender

observerA

NSFileHandleReadCompletionNotification

nil

observerB

nil

addressTableView

observerC

NSWindowDidChangeScreenNotification

documentWindow

observerC

nil

addressTableView

observerD

nil

nil

When notifications are posted to the notification center, each of the observers in Table 2 are notified of the following notifications:

  • observerA: Notifications named NSFileHandleReadCompletionNotification.

  • observerB: Notifications sent by addressTableView.

  • observerC: Notifications named NSWindowDidChangeScreenNotification sent by documentWindow and notifications sent byaddressTableView.

  • observerD: All notifications.

The order in which observers receive notifications is undefined. It is possible for the posting object and the observing object to be the same.

A notification center delivers notifications to observers synchronously. In other words, the postNotification: methods do not return until all observers have received and processed the notification. To send notifications asynchronously use NSNotificationQueue. In a multithreaded application, notifications are always delivered in the thread in which the notification was posted, which may not be the same thread in which an observer registered itself.


Important: The notification center does not retain its observers, therefore, you must ensure that you unregister observers (usingremoveObserver: or removeObserver:name:object:) before they are deallocated. (If you don't, you will generate a runtime error if the center sends a message to a freed object.)

 

Each running Cocoa program has a default notification center. You typically don’t create your own. An NSNotificationCenter object can deliver notifications only within a single program. If you want to post a notification to other processes or receive notifications from other processes, use a NSDistributedNotificationCenter object.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值