一、概述

KVO<NSKeyValueObserving>,是一个非正式协定,提供了一个路径,使对象(观察者)可能察看其余对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变动。指定一个被察看对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)产生更改时,对象会取得告诉,并作出相应解决;【且不须要给被察看的对象增加任何额定代码,就能应用 KVO 机制】

二、应用办法

零碎框架曾经反对KVO,所以程序员在应用的时候非常简单。

1、增加观察者:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;

2、实现察看响应办法:

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary*)change context:(nullable void *)context;

3、移除观察者:

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

假如一个场景,股票的价格显示在以后屏幕上,当股票价格更改的时候,实时显示更新其价格。

1.定义Model,

    @interface StockData : NSObject {        NSString * stockName;        Nsstring * price;    }    @end    @implementation StockData    @end
#import "KVOViewController.h" @interface KVOViewController (){    StockData *stockForKVO;    UILabel *myLabel;}@end @implementation KVOViewController  - (void)viewDidLoad  {      [super viewDidLoad];      //2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在以后的View里边      stockForKVO = [[StockData alloc] init];      [stockForKVO setValue:@"searph" forKey:@"stockName"];      [stockForKVO setValue:@"10.1" forKey:@"price"];      [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];         myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];      myLabel.backgroundColor = [UIColor redColor];      myLabel.text = [stockForKVO valueForKey:@"price"];      [self.view addSubview:myLabel];           UIButton * b = [UIButton buttonWithType:UIButtonTypeCustom];      b.frame = CGRectMake(10, 100, 100, 30);      [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];      [b setTitle:@"测试" forState:(UIControlStateNormal)];      [self.view addSubview:b];//      self.view.backgroundColor = [UIColor greenColor];     }-(void) buttonAction{    [stockForKVO setValue:@"20.0" forKey:@"price"];} -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    if([keyPath isEqualToString:@"price"])    {        myLabel.text = [stockForKVO valueForKey:@"price"];    }}- (void)dealloc{    [stockForKVO removeObserver:self forKeyPath:@"price"];} @end

/**
options参数阐明:
NSKeyValueObservingOptionNew 拿到新值
NSKeyValueObservingOptionOld 拿到旧值
NSKeyValueObservingOptionInitial 注册就会发一下告诉,扭转后还会发
NSKeyValueObservingOptionPrior 扭转之前发一次,扭转后发一次
*/

拓展

1.KVC 与 KVO 的不同?

KVC(键值编码),即 Key-Value Coding,一个非正式的 Protocol,应用字符串(键)拜访一个对象实例变量的机制。而不是通过调用 Setter、Getter 办法等显式的存取形式去拜访。
KVO(键值监听),即 Key-Value Observing,它提供一种机制,当指定的对象的属性被批改后,对象就会承受到告诉,前提是执行了 setter 办法、或者应用了 KVC 赋值。

2.和 notification(告诉)的区别?

notification 比 KVO 多了发送告诉的一步。
两者都是一对多,然而对象之间间接的交互,notification 显著得多,须要notificationCenter 来做为两头交互。而 KVO 如咱们介绍的,设置观察者->解决属性变动,至于两头告诉这一环,则隐秘多了,只留一句“交由零碎告诉”,具体的可参照以上实现过程的分析。

notification 的长处是监听不局限于属性的变动,还能够对多种多样的状态变动进行监听,监听范围广,例如键盘、前后台等零碎告诉的应用也更显灵便不便。

3.与 delegate 的不同?

delegate 一样,KVONSNotification 的作用都是类与类之间的通信。然而与 delegate 不同的是:
这两个都是负责发送接管告诉,剩下的事件由零碎解决,所以不必返回值;而 delegate 则须要通信的对象通过变量(代理)分割;
delegate 个别是一对一,而这两个能够一对多。

本文转载自:风雨「83」