iOS NSMutableArray KVO

2020-05-18  本文已影响0人  落叶随风_90e5

iOS 中 KVO (key-value-observing) 的原理,简单来说就是重写了被观察属性的 set 方法,一般情况下只有通过调用 set 方法对值进行改变才会触发 KVO,直接访问实例变量修改值是不会触发 KVO 的。

例如我们一般要监听name属性的变化 监听name属性.png 这样是没有任何问题的,但是当我们项目中对tableView的dataSource的变化要实现实时更新的时候,我们就要监听tableView.dataSource,按照此思路那我们下面就来实现一下吧 监听dataSource变化.png 这是什么原因呢?这是因为NSMutableArray是一个可变的容器,当 [self.dataSource addObject:@"3"]执行时,我们改变只是dataSource里面的item,并没有改变dataSource,因为KVO的本质是系统监测到某个属性的内存地址或常量改变时 dataSource是否发生改变.png

我们最终的目的并不是为了监听dataSource变化,而是dataSource里面的内容。
那么,该如何实现对 NSMutableArray 的 KVO 呢?官方为我们提供了这个方法- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
像之前一样,为可变数组添加 KVO。在加减元素时,使用这个方法来获取我们要进行操作的可变数组,便可以像普通的属性一样,收到它变化的消息。

正确监听dataSource变化.png

那么为什么mutableArrayValueForKey:这个方法可以监听dataSource内部变化呢?mutableArrayValueForKey:默认采用的是搜索模式,在NSMutableArray搜索匹配insertObject:atIndex:和removeObjectAtIndex:等能引起容器内部Object发生改变的方法,如果发现至少一个插入或者删除方法,就会发送发送消息给原始接受者。

上一篇下一篇

猜你喜欢

热点阅读