KVO原理
原理很簡(jiǎn)單豹芯,就是重寫了被觀察屬性的 set 方法
如果直接訪問(wèn)變量,是無(wú)法觸發(fā)的驱敲。
那針對(duì)數(shù)組的話铁蹈,通常我們只是調(diào)用addObject,或者removeObject众眨,
但以上方法并不會(huì)觸發(fā)set方法握牧,也就不會(huì)觸發(fā)KVO的容诬。
那么,該如何實(shí)現(xiàn)對(duì) NSMutableArray 的 KVO 呢沿腰?
官方為我們提供了這個(gè)方法
解決方案:
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key
舉個(gè)例子:
@property (nonatomic, strong) NSMutableArray *lines;
對(duì)需要觀察的屬性進(jìn)行注冊(cè)
[self addObserver:self
forKeyPath:@"lines"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:nil];
觸發(fā)方法览徒,增刪操作,使用addObject颂龙,或者removeObject并不會(huì)觸發(fā)KVO
[[self mutableArrayValueForKey:@"lines"] addObject:@"1"]习蓬,
觀察回調(diào)方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
if([keyPath isEqualToString:@"lines"]){
NSMutableArray * lines = [self mutableArrayValueForKey:@"lines"];
if (lines.count) {
//do sth
}else{
//do sth
}
}
}