简介
什么是KVO?KVO是Key-Value Observing的简称,翻译成中文就是键值观察。这是iOS支持的一种机制,用来做什么呢?我们在开发应用时经常需要进行通信,比如一个model的某个数据变化了,界面上要进行相应的变化,但是如果我们程序并不知道数据什么时候会进行变化,总不能一直循环判断有没有变化吧,那么就需要在数据变化时给controlller发送一个通知,告知我变化了,你可以更新显示内容了,通知的方式有很多种,比如Notification也是其中一种方式,本文要讲解的KVO也是其中一种很轻巧的方式。
他的实现机制为,为可能改变的数据增加一个观察者,在上面的说法中这个观察者就是controller,它去观察这个数据有没有发生变化,一旦发生变化,就会得到一个信号,从而获取到变化的数据,进行自己要做的操作。
实例效果
如上图所示,界面上设置两个label,一个显示名字,一个显示分数。还有一个按钮,用来修改分数,现在要做到点击按钮分数变化。
可能你会觉得很简单,直接在按钮的响应方法中将分数的label内容修改不就可以了吗,确实如此,但是这里我们不这么做,而是使用KVO来完成。
我们创建一个学生模型,这个模型有两个属性,一个为姓名,一个为分数。label这是读取模型的数据来进行显示。
现在我们给这个实例化了的学生模型添加一个观察者,定义为我要观察学生模型的分数变化情况,这时,如果这个学生模型的分数发生了变化,比如在按钮响应中只对模型的分数属性进行修改,KVO这个机制就会自动给观察者发送通知,说这个属性变化了,你要做什么操作赶紧做。
于是我们在观察者的KVO回调函数中进行相应的操作,如果我们收到了分数变化的通知,那么就将分数label的值给修改为当前的分数。这样就实现了一套KVO键值观察的流程,当然最后还缺一步就是移除观察者,不过要在确实需要移除的时候再移除,因为移除后就不再会收到变化的通知了。
实现方式
上面例子中进行了一套KVO键值观察的流程,我们整理一下进行了哪些工作:
- 设计界面样式
- 建立学生模型
- 对学生的分数属性添加观察
- 修改学生的分数属性
- 在观察到变化的响应方法中进行界面更新操作
- 不再需要观察的时候移除观察
现在通过这个例子来一步步讲解。
设计样式
样式就不说了,两个label,一个按钮,以及按钮的响应方法,都是很常见的。
建立模型
这个部分,就是新建一个NSObject类,用来作为学生模型,有两个属性:姓名和分数,如下所示:
// StudentModel.h
@interface StudentModel : NSObject
@property (nonatomic, copy) NSString *name;
@property float score;
@end
// ViewController.m
// 在controller中实例化学生模型
self.studentModel = [[StudentModel alloc] init];
[self.studentModel setValue:@"Cloudox" forKey:@"name"];
[self.studentModel setValue:@"89.0" forKey