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, // 重新替换
};
网友评论