NotificationCenter、KVO、Delegate

在不过分耦合的前提下,controllers间进行通信:

1.委托delegation;

2.通知中心Notification Center;

3.键值观察key value observing,KVO

1、Delegate:类A调用类B, 当类B想回调类A的方法的时候, 要用到delegate。多用于发送者希望接受到接受者的某个功能反馈值

2、NotificationCenter消息中心:消息的发送者告知接收者事件已经发生或者将要发送,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系,类似于广播的形式。
Notification多用于通知多个Object某个事件。

3、KVO:是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化,更适合任何类型的对象侦听另外一个任意对象的变化,这是一个对象与另外一个对象保持同步的一种方法,即另一个对象发生改变时,观察者立马做出反应。
它只能用来对属性做出反应,而不会用来对方法或者动作做出反应。
用key paths来观察属性也可以观察嵌套对象。


delegate的优势:

1.很严格的语法,所有能响应的时间必须在协议中有清晰的定义

2.因为有严格的语法,所以编译器能帮你检查是否实现了所有应该实现的方法,不容易遗忘和出错

3.使用delegate的时候,逻辑很清楚,控制流程可跟踪和识别

4.在一个controller中可以定义多个协议,每个协议有不同的delegate

5.没有第三方要求保持/监视通信过程,所以假如出了问题,那我们可以比较方便的定位错误代码。

6.能够接受调用的协议方法的返回值,意味着delegate能够提供反馈信息给controller

delegate的缺点:

需要写的代码比较多



有一个“Notification Center”的概念,他是一个单例对象,允许当事件发生的时候通知一些对象,满足控制器与一个任意的对象进行通信的目的,这种模式的基本特征就是接收到在该controller中发生某种事件而产生的消息,controller用一个key(通知名称),这样对于controller是匿名的,其他的使用同样地key来注册了该通知的对象能对通知的事件作出反应。

notification的优势:

1.不需要写多少代码,实现比较简单

2.一个对象发出的通知,多个对象能进行反应,一对多的方式实现很简单

缺点:

1.编译期不会接茬通知是否能被正确处理

2.释放注册的对象时候,需要在通知中心取消注册

3.调试的时候,程序的工作以及控制流程难跟踪

4.需要第三方来管理controller和观察者的联系

5.controller和观察者需要提前知道通知名称、UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况

6.通知发出后,发出通知的对象不能从观察者获得任何反馈。



KVO

KVO是一个对象能观察另一个对象属性的值,前两种模式更适合一个controller和其他的对象进行通信,而KVO适合任何对象监听另一个对象的改变,这是一个对象与另外一个对象保持同步的一种方法。KVO只能对属性做出反应,不会用来对方法或者动作做出反应。

KVO优点:

1.提供一个简单地方法来实现两个对象的同步

2.能对非我们创建的对象做出反应

3.能够提供观察的属性的最新值和先前值

4.用keypaths 来观察属性,因此也可以观察嵌套对象

KVO缺点:

1.观察的属性必须使用string来定义,因此编译器不会出现警告和检查

2.对属性的重构将导致观察不可用

3.复杂的“if”语句要求对象正在观察多个值,这是因为所有的观察都通过一个方法来指向


总结:


1、KVO有显著的使用场景,当你希望监视一个属性的时候,我们选用KVO

而notification和delegate有比较相似的用处,

当处理属性层的消息的事件时候,使用KVO,其他的尽量使用delegate,除非代码需要处理的东西确实很简单,那么用通知很方便。


2、KVO是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。Notification和Delegate模式更加适合一个controller与任何其他的对象进行通信,而 KVO更加适合任何类型的对象侦听另外一个任意对象的改变(这里也可以是controller,但一般不是controller)。这是一个对象与另外一 个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象马上作出反应。它只能用来对属性作出反应,而不会用来对方法或者动作作出反应。

3、效率肯定是delegate比NSNotification高。

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


4、KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。





文/LikeSmilence(简书作者)
原文链接:http://www.jianshu.com/p/51a83e7cb54e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
文/ianCure(简书作者)
原文链接:http://www.jianshu.com/p/d57b055ae5c3
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值