通知中心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

通知队列(通知的聚结和异步发送)

 

posted on 2015-12-20 18:12  tang杰  阅读(299)  评论(0编辑  收藏  举报

导航