委托与通知

objective-c

it分类:IOS

委托(Delegation)

委托是一种设计模式。这种模式虽然简单但是功能强大。委托就是程序中的一个对象代替别的对象来完成某些任务,或者是和别的对象一起协调来完成某些工作。其中,委托者持有对被委托者的引用,并在适当的时间发送消息给被委托者。通过这个消息委托者通知被委托者自己将要处理或者是已经处理了某种事件。被委托者可以相应该消息,更新自己的或者是程序中的用户界面或者是其他对象的状态;并且还可以通过返回值来告知委托者自己对该事件的处理情况,以便委托者决策应该如何采取进一步的行为。

委托和Cocoa框架(Delegation and Cocoa Framework)

在Cocoa框架中,委托者通常都是一个框架类的对象,而被委托者通常都是一个自定义的控制器对象。在需要进行内存管理的环境下,委托者都会持有对被委托者的一个弱引用;而在垃圾收集环境下,委托者持有对被委托者的强引用。在基础库中,UIKit,APPKit以及其他的Cocoa库和Cocoa框架中,存在有大量委托的例子。

一个委托的例子就是AppKit框架中的NSWindow类的对象作为委托者。NSWindow中声明了一个协议(Protocol),其中有一个方法windowShouldClose:。当用户点击窗体上的关闭按钮时,窗体对象就会发送windowShouldClose:消息给其委托(被委托者),询问是否确认关闭该窗体。窗体的委托可以通过返回布尔类型的值来控制窗体对象的行为。

如下图:

窗体对象(委托者)委托(被委托者)

委托与通知(Delegation and Notifications)

Cocoa框架中大多数类的委托都是自动地被注册为委托者发送的通知的观察者。委托只需要实现在框架类中已经声明了得通知方法来接收指定的通知消息即可。正如前面的示例一样,窗体对象会发送NSWindowsWillCloseNotification消息给所有观察者,但是只会给其委托发送一个windowShouldClose:消息。

数据源(DataSource)

数据源几乎和委托时等同的。区别在于他们和委托者的关系不同。数据源被委托是用来控制数据的,而不是处理用户界面的。委托者,通常都是一个视图对象,比如table 视图,会持有其数据源的引用并根据需要向其请求需要显示的数据。数据源,和委托类似,必需遵守一定的协议并实现协议中要求的最小的方法集。数据源要为其委托者视图的数据模型对象的内存管理负责。

通知(Notification)

通知是一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件的消息。Cocoa中的通知机制遵循的是一种广播的模式。它是一种程序中事件的发起者或者是处理者和其他想要知道该事件的对象沟通的一种方式。消息的接收者,也就是观察者响应该事件来变换自己的UI,行为或者是状态。发送通知的对象没有必要知道这些观察者都是谁。因此,通知时一种在程序中可以获得高效协作同时保持较高内聚性的机制。他减少了程序中对象相互之间的强依耐性(这种依耐性会大大降低程序中代码的可复用性)。基础库,AppKit以及其他的一些Objective-C框架中的很多类都定义了通知以便我们可以注册成为通知的观察者。

通知机制的核心就是一个进程中单一实例的对象,被叫做通知中心(NSNotificationCenter)。当一个对象发布一个通知时,通知会先被发布到通知中心。通知中心的作用相当于是交流所,作为通知的广播中心。程序中其他需要感知该事件的对象通过向通知中心注册就可以达到在事件发生时被通知中心及时通知到得目的。通知中心是可以以同步的方式向其观察者发送通知,也是可以通过使用通知队列(NSNotificationQueue)来异步地发送通知。

用于表示通知的对象

一个通知是用NSNotification类的一个对象来表示的。表示通知的对象中含有用于表示该通知的信息的字段:通知的名称,发布通知的对象以及一个用于表示其他补充信息的字典。这个字典被称为是userInfo字典。当通知被发送给对其感兴趣的观察者时,该表示通知的对象会被作为参数传入到处理该通知的方法中。

观察指定的通知

实现观察某个通知的时候,我们先要获取NSNotificationCenter的单实例对象并向其发送addObserver:selector:name:object:消息。通常情况下,这种注册的行为在应用程序启动后就要进行。addObserver:selector:name:object:方法的第二个参数是一个选择器,该选择器指定的是处理指定通知的具体方法。方法的原型必需如下:

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

在该方法中,我们可以提取通知中的相关信息来帮助我们处理数据,特别是userInfo中的数据(如果userInfo存在的话)。

发布通知

通常在发布通知之前,我们都需要定义一个全局的字符串常量来作为通知的名称。传统的做法是采用和应用程序相关的两个或者三个字母作为通知名称的前缀,例如:

NSString & AMMyNotification = @”AMMyNotification”;

通过向NSNotificationCenter的单实例对象发送postNotificationName:object:userInfo:(或者类似的)消息来完成通知的发布。在向通知中心发送通知之前,该方法会先创建一个表示该通知的对象。

委托机制原文:https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

通知机制原文:https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 通知 第一个页面1.注册通知2.拿到暗号,做事情 ``` -(void)justDoIt:(NSNotificat...
    你瞅誰阅读 569评论 2 3
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,125评论 29 470
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,674评论 0 15
  • 低耦合性是良好程序的特性。低耦合性程序可读性和可维护性比较好。Cocoa中的委托、通知功能可以使低耦合性更易实现,...
    pro648阅读 1,028评论 0 2