美文网首页iOS知识小总结
KVO-容器类的观察

KVO-容器类的观察

作者: 宇宇宇啊啊啊 | 来源:发表于2021-03-15 23:19 被阅读0次

    1.KVO对Array的观察。

    我们平时对于对象的属性进行KVO的观察时,都是需要观察变化的对象调用addObserver方法,监听的属性为keyPath。但是:
    [self.person addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil];
    [self.person.array addObject:@"hello"];

    这种写法是监听不到的。

    因为系统KVO的封装是监听set方法,而键值观察通知依赖于 NSObject 的两个方法willChangeValueForKey:didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而observeValueForKey:ofObject:change:context: 也会被调用。

    所以我们需要通过KVO提供的一个方法:
    NSMutableArray tempArr = [self.person mutableArrayValueForKey:@"array"];
    [tempArr addObject:@"hello"];
    通过mutableArrayValueForKey:所取到的数组对象类型是NSKeyValueNotifyingMutableArray
    ,为NSMutableArray的子类。和对象类观察相似,同样是在子类中动态调用了willChangeValueForKey:didChangevlueForKey:方法。

    另外说明一些,observeValueForKey:ofObject:change:context:方法中的change[@"kind"]解释,其实是一个枚举:
    typedef NS_ENUM(NSUInteger, NSKeyValueChange) {
    NSKeyValueChangeSetting = 1, // 通过setting方法监听
    NSKeyValueChangeInsertion = 2, // 通过容器类的插入
    NSKeyValueChangeRemoval = 3, // removal
    NSKeyValueChangeReplacement = 4, // 重新替换
    };

    相关文章

      网友评论

        本文标题:KVO-容器类的观察

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