iOS Notification

来源:互联网 发布:图书馆数据库是什么 编辑:程序博客网 时间:2024/05/22 15:26

1.

Delegate:
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:
消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

2.

很早stepwise上有一篇很经典的文章抓没讲delegate和notificationde的区别的,不过很遗憾现在stepwise下线了。
简单说,
1. 效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以 notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个 notification后就什么都不管了也不会等待接受者的反应。

什么是Notification

 

Notification 是一种消息,它传递给一个或多个观察对对象用来通知它们程序里发生了一个事件。

Notification这种Cocoa框架下的机制是遵循广播模式。它是一个对象初始化或处理一个程序事件时与其它任何数目的想要知道此事件的对象们交流的一种方式。

notification的接收者可以根据监听到的事件来调整它们自己的前后外观、行为和状态。

发送notification的对象不是一定要知道它的收听者都有谁。在程序的协调和聚合方面,Notification是一种很强大的机制。它减少了程序里对象之间那种强烈依赖关系的需求(这种依赖关系会减少对象的重用能力)。很对Foundation,AppKit和其它Objective-C框架的类都定义了notification,你可以通过注册来成为观察者。

 

该通报机制的核心是每个进程的singleton对象,也就是我们熟知的notification center(NSNotificationCenter).当一个对象提交了一个notification,消息被传到notification center(notification充当结算地和广播中心的角色)

需要知道这个事件的对象无论处于应用程序的什么位置,需要通过notification center来注册,然后notification center才能让它知道这个事件什么发生。Notification center使用同步的传递一个notification给它的观察者们,你也可以使用一个notification queue来发送一个异步的notification

 

 

 

 

Notification 对象

 

一个notification是一个NSNotification 类的实例。一个notification对象包含了几个信息:

一个唯一的名称、发布notification的对象和(optionnel)补充信息字典(被称为用户信息字典)。当一个notification被传递给一个观察者,notifiction对象也通过处理notification的方法参数被传递过去。

 

观察一个Notification

 

你需要获得NSNotificationCenter的单例,然后发送一个addObserver:selector:name:object:的消息给它,从而成为这个notification的观察者。这个消息的第二个参数,是一个selector指向当取得notification时你需要调用的一个方法。

方法的格式如下:

-(void)myNotificationHandler:(NSNotification *)notif;

 

 

发送一个Notification

 

在你开始发送一个Notification之前,你应该定义一个唯一的全局字符串常量来做为你的notification的名字。通常用两到三个字母的应用程序特定前缀,例如:

NSString * AMMyNotification = @"AMMyNotification";

发送一个 postNotificationName:object:userInfo: 的消息给NSNotificationCenter对象的单例,就可以post一个notification。这个方法在它发送notification至notification center之前会先创建notification对象。

下面来让我们看一个Notification的例子:

  //声明一个消息,名称为chgValue,发送者是对象本身。

    NSNotification *ntf = [NSNotificationnotificationWithName:@"chgValue"object:self];

 

  //获得消息中心的单例,将定义好的消息发送给消息中心。

    NSNotificationCenter *ntfCenter = [NSNotificationCenterdefaultCenter];

 

 

  //将来源是本对象,名称为chgValue的消息分发给本对象的getNtf方法

  [ntfCenter addObserver:selfselector:@selector(getNtf:) name:@"chgValue" object:self];

 

  //发送消息给消息中心

  [ntfCenter postNotification:ntf];

 

 

这样一个简单的notification的发送接收就完成了。

一个实例代码:NotificationDemo

更多有关notification的资料请看这里:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043-SW1。