KVO与通知的区别

KVO(Key-Value Observing),俗称键值监听。它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。转:http://blog.csdn.net/lxl_815520/article/details/51153168

通知中心(NSNotificationCenter)实际是在程序内部提供了一种广播机制。把接收到的消息,根据内部的消息转发表,将消息转发给需要的对象。这句话其实已经很明显的告诉我们要如何使用通知了。第一步:在需要的地方注册要观察的通知,第二步:在某地方发送通知。(这里注意:发送的通知可能是我们自定义的,也可能是系统的)。转:http://blog.csdn.net/qq_27325349/article/details/51583898

KVO使用:被观察着发生addobserver:forkeyPath:options:context:方法来添加观察者.然后只要被观察者的keypath值发生变化(注意单纯改变值不会调用此方法,只有通过getter和sett来改变值才会触发KVO),就会在观察者里调用方法observerValueForKeyPath:ofobject:change:context:因此实现此方法来对KVO发出的通知做出响应.

这些代码都是秩序在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁要注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活很简便,但是KVO只能检测类中属性,并且属性名都是通过NSString来查找,编译器不会帮你检测对错和补全,纯手敲会比较容易出错

通知的使用:通知的发出是由通知中心来统一发出,而不同通知通过唯一标示名notifcationName来区分,标示名由发送通知的类来起.首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:发出通知notificationName这样发送通知着这边的工作就完成了,每次A被调用,就会发送一次通知notificationName

然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter] 的方法addobserver:sslector:name:object为观察者注册监听name为notificationNmae的通知.

每次发出name为notificationNmae的通知时,注册监听后的观察着就会调用其自己定义的方法notificationselector来进行相应

NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后,再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用灵活.

你可能感兴趣的