IOS delegate, notification, KVO区别及使用

简单说,
1. 效率肯定是delegate比nsnotification高。

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

 

如果2个模块之间有关系,就用delegate
比如,view 和 subview,view 和viewController,前一个view 和后一个view,等等兄弟姐妹父子关系
2个模块不沾边的情况下,选notification

———————–

在程序设计过程中,我使用最多的是delegate和notification,用来完成控制器之间的数据传输和界面更新。kvo也了解过,但是开发的时候用的少之又少,
最近接触到一个项目,很多地方使用了kvo,下面我就说说对使用kvo所获得的一些感受。

kvo的概念到处都是,不再copy复述,大致就是注册消息,通过观察对象,查找键值,然后在委托中截获消息,进行相应的处理。

再说下自己理解的kvo的好处还有坏处。

好处:只要观察的对象本身没有发生改变(指针发生变化),就可以在任何地方通过添加监听,截获对象及其属性的变化,并对此进行相应的处理。
对于逻辑简单清晰的需求,可以减少代码量,减轻代码耦合度。

坏处: 在比较复杂的逻辑页面中,第一,kvo只要监听到对象发生改变,就会触发伪托方法,使代码的逻辑变得模糊,可读性差。相对的,伪托和推送逻辑能更清晰,只在需要的地方使用。第二,kvo本质是通过监听对象,查找发生变化的键值,这个操作应当是个轮寻的方式,如果多次对对象进行操作,相对伪托和postNotification降低了性能。

总结,当不能很好的把握程序的逻辑时,使用伪托等方式处理数据和界面更新更加合理。当逻辑简单清晰时,使用kvo

基本现在想到的就这些,待以后发现,继续补充。也欢迎各位给予补充和指正。

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s