浅谈KVO, iOS的开发之旅

我们应该了解的基础知识

所谓的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:日积月累, 天天进步
纪念单身狗的每一天...

你可能感兴趣的:(浅谈KVO, iOS的开发之旅)