iOS 中 KVO (key-value-observing) 的原理,简单来说就是重写了被观察属性的 set 方法,一般情况下只有通过调用 set 方法对值进行改变才会触发 KVO,直接访问实例变量修改值是不会触发 KVO 的。
我们最终的目的并不是为了监听dataSource变化,而是dataSource里面的内容。
那么,该如何实现对 NSMutableArray 的 KVO 呢?官方为我们提供了这个方法- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
像之前一样,为可变数组添加 KVO。在加减元素时,使用这个方法来获取我们要进行操作的可变数组,便可以像普通的属性一样,收到它变化的消息。
那么为什么mutableArrayValueForKey:这个方法可以监听dataSource内部变化呢?mutableArrayValueForKey:默认采用的是搜索模式,在NSMutableArray搜索匹配insertObject:atIndex:和removeObjectAtIndex:等能引起容器内部Object发生改变的方法,如果发现至少一个插入或者删除方法,就会发送发送消息给原始接受者。