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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容