通过KVO
监听数组时,当直接通过.
语法获取的数组来添加或删除元素时并不会触发KVO
,需要通过KVC
的方式来获取数组然后再添加或删除元素才会触发KVO
。
[self.school addObserver:self forKeyPath:@"studentArr" options:NSKeyValueObservingOptionNew context:NULL];
Student *stu = [[Student alloc] init];
// 通过这种方式添加元素不会触发KVO
[self.school.studentArr addObject:stu];
// 通过这种方式添加元素可以触发KVO,因为KVO原理是对set方法的监听,通过KVC获取到属性值,这样才能观察到数组属性的修改
[[self.school mutableArrayValueForKey:@"studentArr"] addObject:stu];
当然,也可以通过手动触发KVO
来解决这个问题:
[self.school willChangeValueForKey:@"studentArr"];
[self.school.studentArr addObject:stu];
[self.school didChangeValueForKey:@"studentArr"];
网友评论