KVO定义
KVO属于观察者模式,这种设计在很多地方都能用到,比如我们的响应式编程,代表框架RAC等.
键值观察是一种机制,当指定对象属性改变的时候允许另一对象接受通知.
KVO基本使用
使用KVO分为三个步骤:
- 通过addObserver: forKeyPath: options:context:方法添加观察者,观察者可以接受keyPath属性的变化事件.
- 在观察者中实现observeValueForKeyPath:ofObject: change: context:方法,当keyPath属性发生变化时,KVO会回调这个方法来通知观察者.
-
当观察者不需要监听时,可以调用removeObserver:forKeyPath:方法将KVO移除,需要注意的是,调用removeObserver需要在观察者消失之前,否则会导致Crash.
代码如下图所示
代码图.png
002.png
![](https://img.haomeiwen.com/i6114561/78e4e2ff6c259d31.png)
KVO触发模式
KVO在属性发生改变时的调用是自动的,如果想手动控制这个调用时机,或者想自己实现KVO属性的调用,则可以通多KVO提供的方法进行调用.
废话不多说直接上代码!!
@implementation Person
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
return NO;
}
如果返回NO通知就不会被触发,系统默认是自动调用触发通知的.
注意:这里我们可以通过Key值来修改,否则整个类的属性都变成手动的了!!
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
if ([key isEqualToString:@"name"]) {
return NO;
}
return YES;
}
运行!! 这个时候点击是没有反应的,需要我们手动的去触发.
![](https://img.haomeiwen.com/i6114561/b51c0461e75794b5.png)
加上这两句就OK了,这样我们的选择机会更多,有的时候我们只有在特定条件下需要通知观察者对吧!!
KVO属性依赖
![](https://img.haomeiwen.com/i6114561/e14b90799bd1546e.png)
![](https://img.haomeiwen.com/i6114561/90322c4097f0ad80.png)
![](https://img.haomeiwen.com/i6114561/53117344d285194b.png)
![](https://img.haomeiwen.com/i6114561/d14b091cc86de254.png)
这样我们就可以实现观察多个属性值了.
KVO原理探究
![](https://img.haomeiwen.com/i6114561/9638c40094e84278.png)
![](https://img.haomeiwen.com/i6114561/91dc5807cdfcd533.png)
![](https://img.haomeiwen.com/i6114561/5a8def3c406f33a2.png)
![](https://img.haomeiwen.com/i6114561/ce25e7c7e4da7501.png)
自定义KVO
![](https://img.haomeiwen.com/i6114561/0a39e83c26d64930.png)
![](https://img.haomeiwen.com/i6114561/67af94b78d2ebd96.png)
![](https://img.haomeiwen.com/i6114561/6d120120b3a8ef2d.png)
这样就实现了自定义KVO.
KVO对容器类的监听
有时候我们需要对对象里面的数组或者其他容器类监听 我们需要怎么做呢
如下所示
![](https://img.haomeiwen.com/i6114561/4892ed0dc12ea445.png)
![](https://img.haomeiwen.com/i6114561/8e37701d61c11b3a.png)
![](https://img.haomeiwen.com/i6114561/69c496db854db098.png)
至此,我们已经完成KVO的基本使用,底层原理,自定义等内容,不足之处希望大佬指点,如果你感觉还不错,顺手点个赞,谢谢!
转载请注明出处!
网友评论