美文网首页
iOS-KVO基本使用和底层实现原理

iOS-KVO基本使用和底层实现原理

作者: LWide | 来源:发表于2018-11-09 15:52 被阅读0次

    KVO定义

    KVO属于观察者模式,这种设计在很多地方都能用到,比如我们的响应式编程,代表框架RAC等.
    键值观察是一种机制,当指定对象属性改变的时候允许另一对象接受通知.

    KVO基本使用

    使用KVO分为三个步骤:

    1. 通过addObserver: forKeyPath: options:context:方法添加观察者,观察者可以接受keyPath属性的变化事件.
    2. 在观察者中实现observeValueForKeyPath:ofObject: change: context:方法,当keyPath属性发生变化时,KVO会回调这个方法来通知观察者.
    3. 当观察者不需要监听时,可以调用removeObserver:forKeyPath:方法将KVO移除,需要注意的是,调用removeObserver需要在观察者消失之前,否则会导致Crash.
      代码如下图所示


      代码图.png
      002.png
    003.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;
    }
    

    运行!! 这个时候点击是没有反应的,需要我们手动的去触发.


    手动触发.png

    加上这两句就OK了,这样我们的选择机会更多,有的时候我们只有在特定条件下需要通知观察者对吧!!

    KVO属性依赖

    Snip20181108_8.png Snip20181108_10.png Snip20181108_11.png Snip20181108_12.png

    这样我们就可以实现观察多个属性值了.

    KVO原理探究

    Snip20181109_1.png Snip20181109_2.png Snip20181109_3.png Snip20181109_4.png

    自定义KVO

    Snip20181109_5.png Snip20181109_6.png Snip20181109_7.png

    这样就实现了自定义KVO.

    KVO对容器类的监听

    有时候我们需要对对象里面的数组或者其他容器类监听 我们需要怎么做呢
    如下所示


    Snip20181109_8.png Snip20181109_9.png Snip20181109_10.png

    至此,我们已经完成KVO的基本使用,底层原理,自定义等内容,不足之处希望大佬指点,如果你感觉还不错,顺手点个赞,谢谢!
    转载请注明出处!

    相关文章

      网友评论

          本文标题:iOS-KVO基本使用和底层实现原理

          本文链接:https://www.haomeiwen.com/subject/nnvwxqtx.html