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

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

     

  • 相关阅读:
    slots属性(省内存,限制属性的定义)
    自定制格式化方式format
    改变对象的字符串显示__str__repr
    __getattribute__和item系列
    授权(类似)
    双下划线开头的attr方法
    动态导入模块
    反射
    python的单下划线和双下划线
    在子类中调用父类的方法
  • 原文地址:https://www.cnblogs.com/tang910103/p/5061458.html
Copyright © 2020-2023  润新知