应用场景: 通过观察一个数组的数据变化,来更新UI界面元素,比如这个需求在UITableview中就属于比较常见的.而默认的情况下,KVO是不支持观察数组的….
将数组(既然观察数组要变化,当然是可变数组了)作为一个属性
1 | @property (nonatomic, strong) NSMutableArray *dataArray; |
第二步
注册观察者和实现观察者方法,如果是UITableviewController,可以这样写
1 | [self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew context:NULL]; |
观察者监听方法
1 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"keypath ==%@ object ==%@" ,keyPath, object ); } |
第三步
使用下面这样的方法来给数组添加数据或删除数据
1 | [[self mutableArrayValueForKey:@"dataArray"] addObject:@"adfasdf"]; |
第四步
移除观察者
1 | - (void)dealloc{ [self removeObserver:self forKeyPath:@"dataArray" context:NULL]; } |
小结
KVO模式中,对于基本数据类型是观察值的变化,但对于指针类型(OC中对象都是指针),是观察指针的地址是否变化.而数组中的数据变化时,数组的地址是不变的,所以KVO就认为数组没有变化
在第三步中,必须使用mutableArrayValueForKey的方式访问数组,才会收到数组内容变化的通知.
一定要记得最后使用完后,释放观察者,否则程序崩溃.