使用KVO监听数组的小技巧

应用场景: 通过观察一个数组的数据变化,来更新UI界面元素,比如这个需求在UITableview中就属于比较常见的.而默认的情况下,KVO是不支持观察数组的….

  • 要实现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的方式访问数组,才会收到数组内容变化的通知.

  • 一定要记得最后使用完后,释放观察者,否则程序崩溃.