KVO & 通知

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];
}

你可能感兴趣的:(KVO & 通知)