1.效率肯定是delegate比nsnotification高。
2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotific<wbr>ation,那么nswindow对象放出这个notification后就什么都不管了也不会等待接受者的反应。</wbr>
简明概要的说明了KVO和NSNotification的区别:
和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。
1)KVO的使用:
被观察者发出<wbr><strong>addObserver:forKeyPath:options:context:<wbr></wbr></strong>方法来添加观察者。</wbr>
然后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:
因此观察者需要实现方法<wbr><strong>observeValueForKeyPath:ofObject:change:context:<wbr></wbr></strong>来对KVO发出的通知做出响应。</wbr>
这些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。
2)NSNotification的使用
这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。
首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName。
然后谁要监听A的变化,就通过[NSNotificationCenterdefaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应。
NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。
分享到:
相关推荐
主要介绍了iOS 中KVC、KVO、NSNotification、delegate 总结及区别的相关资料,需要的朋友可以参考下
使用KVC对属性赋值 使用KVC对属性取值 KVC对数组取值 KVO是key value observing, 它是一种非常重要的机制,允许监听属性值的变化
delegate、NSNotification、block三者的比较,用简单的事例来讲解三者之间的区别
一、NSNotification和Delegate的联系和区别 众所周知,IOS中经常会使用到NSNotification和delegate来进行一些类之间的消息传递。言归正传,这两种有什么区别呢? NSNotification就是IOS提供的一个消息中心,由一个...
主要介绍了IOS NSNotification 键盘遮挡问题的解决办法的相关资料,希望通过本文能帮助到大家,解决这样的问题,需要的朋友可以参考下
刚接触到通知,觉得这个还是很多地方用的到,所以写了个demo现打包如下,功能简单,望批评指正
通过NSNotification,块和KVO进行通知/回调。 提取状态值不会阻塞。 回调和KVO总是在主线程上发生,因此它是UI安全的。 KSReachableOperation:建立可达性时执行的一键式操作。 支持iOS和Mac OSX。 可以在...
快速,强类型,易使用的消息总线,兼容NSNotification.zip,iOS事件总线,支持AppDelegate解耦,支持基于响应链的局部总线
它包含Core , Event , UI三层,封装了数据持久化,数据缓存(文件缓存,内存缓存),kvo,Notification,delegate,动画,图片处理,自定义了ViewController生命周期。 本库采用ARC XY快速 核 XYTimer //定时器类 ...
一个简单的库,用于使用 UIControl、NSNotification、Key Value Observing... ##Install with CocoaPod pod 'ObserverKit' 和 #import "OKObserver.h" #import "NSObject+OKObserver.h" // Optional ##例子 ...
SRGModelEvent 是 NSNotification 的瘦包装库,可以更轻松地观察/通知您的模型。 安装 将以下行添加到您的 podfile 并运行pod update 。 pod 'SRGModelEvent' 用法 首先你需要包含头文件。 # import " ...
广州通知中心 该库允许您以最简单的方式使用 CFNotificationCenter(通过 Core Foundation)。 您可以通过“addObserver”和“postNotification”调用它来执行任务。
ios demo,NSNotificationCenter,app进入后台时的调用和就、进入前台时的调用。
这个 repo 中有一个演示: #import "AppDelegate.h"@implementation AppDelegate- (void) applicationDidFinishLaunching:(NSNotification *) aNotification {self.recorder1.delegate = self;self.recorder2....
在iOS开发中,常见的几种逆向传值方式,有代理(delegate)、通知(NSNotification),block等等,本文就给大家分析下,如何理解和快速上手代理模式,并以一个简单的逆向传值为案例,看看代理模式是不是很难。...
osx-亮度在OS X中获取或设置屏幕亮度安装$ npm install --save osx-brightness用法const osxBrightness = require ( 'osx-brightness' ) ;osxBrightness . set ( 0.75 ) . then ( ( ) => {console ....