我们应该了解的基础知识
所谓的KVO就是key-value-observeing, 翻译过来就是 观察者模式
首先我们应该知道KVO是不能直接监听控制器ViewController数组的变化的,需要将数组定义在模型中,然后控制器ViewController持有模型对象,通过该对象才能监听。
注册监听
addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>
重写监听方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
移除监听
[ removeObserver:self forKeyPath:@""];
代码如下
首先先设置ViewController的分类
@interface Model : NSObject
@property (strong,nonatomic)NSMutableArray *modelArray;
@end
实现部分
-(NSMutableArray *)modelArray{
if(!_modelArray){
_modelArray = [NSMutableArray array];
}
return _modelArray;
}
@end
//1.创建模型对象
[self.model addObserver:self forKeyPath:@"modelArray" options:NSKeyValueObservingOptionNew context:nil];
需要注意的是数组的添加/删除必须采用这个方法 mutableArrayValueForKeyPath
[[self.model mutableArrayValueForKeyPath:@"数组名字"] addObject:@"添加的Object"];
[[self.model mutableArrayValueForKeyPath:@"数组名字"] removeObject:@"删除的Object"];
监听方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{
if (![keyPath isEqualToString:@"modelArray"]) {
// NSLog(@"%ld",_model.modelArray.count);
return;
}
}
移除监听
- (void)dealloc {
[_model removeObserver:self forKeyPath:@"modelArray"];
}
PS:日积月累, 天天进步
纪念单身狗的每一天...
网友评论