KVO:
提供一种机制,当指定的被观察的对象
的属性被修改后,KVO会自动通知响应的观察者
(KVC - 键值编码 是KVO的基础)
通知:
是一种广播机制,在实践发生的时候,通过通知中心对象
能够为所有关心这个时间发生的对象发送消息。
两者都是观察者模式,不同在于:
KVO
是被观察者直接发送消息给观察者
,是对象间的直接交互
通知
则是两者都和通知中心对象交互,对象之间不知道彼此
KVO的使用:
被观察者
通过addobserver:forkeyPath:options:context:
方法来添加观察者observer
,然后只要被观察者
的keypath
值发生变化,就会在观察者
里调用方法observerValueForKeyPath:ofobject:change:context:
因此实现此方法来对KVO
发出的通知做出响应。这些代码都是在观察者
里进行实现,被观察者
不用添加任何代码,所以谁要监听谁要注册,然后对响应进行处理即可,使得观察者
与被观察者
完全解耦,运用很灵活很简便。但是KVO
只能检测类中属性,并且属性名都是通过NSString
来查找,编译器不会帮你检测对错和补全,纯手敲比较容易出错!
通知的使用:
通知的发出是由通知中心
来统一发出,而不同通知通过唯一标识名notifcationName
来区分,标识名由发送通知的类来起。首先被观察者
自己在某个方法(A)里,通过方法postNotificationName:object:
发出通知notificationName
,这样发送通知者这边的工作就完成了,每次A被执行,就会发送一次通知notificationName
。
然后如果需要有监听A的变化的地方,就通过[NSNotificationCenter defaultCenter]
的方法addobserver:selector:name:object
为观察者
注册监听通知名称为notificationName
的通知。
每次发出通知名称为notificationName
的通知时,注册监听后的观察者
就会调用其自己定义的方法notificationselector
来进行相应。
NSNotification
的特点:就是需要被观察者
先主动发出通知,然后观察者
注册监听后,再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用灵活。
注意:都需要最后移除观察者!!
KVO:
1、增加观察者
调用的方法是同一个,根据keyPath值进行判断做不同的任务!!!!!
[self.textField addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
2、观察者实现监听方法:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"text"]) {
NSLog(@"文本框的内容发生改变,%@", self.textField.text);
}
}
3、调用执行方法:
// 调用-自动执行实现的方法
[self.textField setValue:@"123" forKeyPath:@"text"]; // 文本框里面也赋值
self.textField.text = @"asd"; // 也是可以调用的
4、kvo的移除观察者
- (void)dealloc
{
[self.inputTextField removeObserver:self forKeyPath:@"text"];
}
通知:
1、注册一个通知,实现一个方法,方法与方法之间是独立的
// 注册通知 ---- 观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldValueChange:) name:@"textFieldValueChangeNotication" object:nil];
2、观察者实现@selector方法
- (void)textFieldValueChange:(NSNotification *)noti
{
NSLog(@"%@", noti.userInfo);
}
3、被观察者发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"textFieldValueChangeNotication" object:nil];
4、观察者移除通知
// 观察者移除通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 也可移除 某个指定的通知
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"textFieldValueChangeNotication" object:nil];
}