zoukankan      html  css  js  c++  java
  • iOS 常用设计模式和机制之KVO

    KVO   http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/    

    定义:

    KVO:Key-Value Observing,是Foundation框架提供的一种机制,使用KVO,可以让       观察者(Observing)        方便地对指定对象(Object)   的   指定属性(Key)    进行观察,当属性发生变化       <如值(Value)变化时>    时,观察者  会被通知。

    使用:KVO只需要两个步骤: 1.注册Observer; 2.接收通知

    a 注册Observer

    - (void)addObserver:(NSObject *)observer

              forKeyPath:(NSString *)keyPath

              options:(NSKeyValueObservingOptions)options

              context:(nullable void *)context;

    参数含义 :

    observer :观察者,需要响应属性变化的对象。该对象必须实现(接收通知的方法)

    keyPath :要观察的属性名称,要和属性声明的名称一致。注意:是字符串类型

    options :对 KVO机制进行配置,修改KVO通知的时机以及通知的内容。

    context :接收一个 C 指针 ,指向希望监听的属性。如 : &self->_testData

    注: 使用   需要被监听对象(Object)     来调用这个方法(注册)

     b 接收通知

    - (void)observeValueForKeyPath:(nullable NSString *)keyPath

                             ofObject:(nullable id)object

                             change:(nullable NSDictionary<NSString*, id> *)change

                             context:(nullable void *)context;

    参数含义 :

    object:这个是所监听的对象,也就是所监听的属性所属的对象。

    change:是传入的变化量,根据在注册时用 options 参数 进行配置,参数不同,会包含不同的内容。

    其他参数同注册方法一样。

    注意:在实现这个方法时, 一定要对注册监听的所有属性都进行处理——使用context参数进行判断——否则Xcode会警告。

    c 注意: 注册Observer之后一定要在合适的机会解除注册,否则会引发资源泄露,取消注册的方法

    - (void)removeObserver:(NSObject *)observer

                  forKeyPath:(NSString *)keyPath

                   context:(nullable void *)context NS_AVAILABLE(10_7, 5_0);

    options 参数

    typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {

         NSKeyValueObservingOptionNew = 0x01,

         NSKeyValueObservingOptionOld = 0x02,

         NSKeyValueObservingOptionInitial NS_ENUM_AVAILABLE(10_5, 2_0) = 0x04,

         NSKeyValueObservingOptionPrior NS_ENUM_AVAILABLE(10_5, 2_0) = 0x08

    };

    值含义:

    NSKeyValueObservingOptionNew 接收方法中使用change参数传入变化后的新值,键为:NSKeyValueChangeNewKey;

    NSKeyValueObservingOptionOld 接收方法中使用change参数传入变化前的旧值,键为:NSKeyValueChangeOldKey;

    NSKeyValueObservingOptionInitial 注册之后立刻调用接收方法,如果配置了NSKeyValueObservingOptionNew,change参数内容会包含新值,键为:NSKeyValueChangeNewKey;

    NSKeyValueObservingOptionPrior 如果加入这个参数,接收方法会在变化前后分别调用一次,共两次,变化前的通知change参数包含notificationIsPrior = 1。其他内容根据NSKeyValueObservingOptionNew和NSKeyValueObservingOptionOld的配置确定。

    change 参数

    typedef NS_ENUM(NSUInteger, NSKeyValueChange) {     NSKeyValueChangeSetting = 1,     NSKeyValueChangeInsertion = 2,     NSKeyValueChangeRemoval = 3,     NSKeyValueChangeReplacement = 4,

    };

    值含义:

        NSKeyValueChangeSetting 属性的值被重新设置;

        NSKeyValueChangeInsertion

        NSKeyValueChangeRemoval

        NSKeyValueChangeReplacement 表示更改的是集合属性,分别代表插入、删除、替换操作。

          如果NSKeyValueChangeKindKey参数是针对集合属性的三个之一,change参数还会包含一个NSKeyValueChangeIndexesKey键值对,表示变化的index。

    自动通知和手动通知

    上文提到,KVO默认会自动通知观察者。取消自动通知的方法是实现

    + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;

    方法,通过返回NO来控制取消自动通知。

    针对非自动通知的属性,可以分别在变化之前和之后手动调用如下方法(will在前,did在后)来手动通知观察者: (will/did)ChangeValueForKey: (will/did)ChangeValueForKey:withSetMutation:usingObjects: (will/did)Change:valuesAtIndexes:forKey:

    因为大多情况下都使用自动通知,这里就不过多解释。事实上自动通知也是框架通过调用这些方法实现的。

  • 相关阅读:
    jar与war包区别,转自https://www.jianshu.com/p/3b5c45e8e5bd
    关于spring
    关于 SQL 的操作
    IDEA 创建一个完整maven项目
    用 eclipse 生成 maven 项目快速生成 web.xml 文件
    Spring拦截器中@Value无效的解决办法
    错误:java.lang.IllegalArgumentException: An invalid character [34] was present in the Cookie value
    错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.7:resources (default-resources) on project sea rch-zk-increment-monitor: Mark invalid -> [Help 1]
    错误:Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to localhost:8761 timed out
    关于 Spring 的示例
  • 原文地址:https://www.cnblogs.com/chenbowen/p/6030628.html
Copyright © 2011-2022 走看看