NSArray,NSMutableArray的KVO操作-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

NSArray,NSMutableArray的KVO操作

简介: KVO(Key Value Observe),键值观察,一种典型的观察者模式。iOS另一个观察者模式Notification,不过这个要在消息中心注册,相比而言比较麻烦。 建立KVO的三个步骤: 1、注册要监控的对象属性addObserver:forKeyPath:options:context: 2、observeValueForKeyPath:ofObject:ch

KVO(Key Value Observe),键值观察,一种典型的观察者模式。iOS另一个观察者模式Notification,不过这个要在消息中心注册,相比而言比较麻烦。

建立KVO的三个步骤:
1、注册要监控的对象属性addObserver:forKeyPath:options:context:
2、observeValueForKeyPath:ofObject:change:context:,当观察的属性变化时会调用该方法
3、取消注册观察removeObserver:forKeyPath:context:

注意,理论上KVO只能对对象属性才有效,所以如果要KVC数组,必须将其转换为对象属性,直接的作法就是直接构造一个继承nsobject的类,将数组作为类中的属性。

//定义一个包含监控数组的类
@interface XZpicarr : NSObject
@property (nonatomic,strong)   NSMutableArray* arr;//要监控的数组
-(BOOL)saveData;
-(BOOL)getData;
@end

然后按照上面的步骤添加监控,监控者就是对象所在的control,也就是self,key就是对应的数组名称:

 self.picarr=[[XZpicarr alloc]init];
 [self.picarr addObserver:self forKeyPath:@"arr" options:NSKeyValueObservingOptionNew
     |NSKeyValueObservingOptionOld context:nil];

数组的增减必须以下形式:

[[self.picarr mutableArrayValueForKey:@"arr"] addObject:noti.object];//增加
[[self.picarr mutableArrayValueForKey:@"arr"] removeObjectAtIndex:nori.object];//删除

mutableArrayValueForKey KVC的数组取值方式,要实现KVO必须通过KVC对数据进行操作,一般情况下,数组是没有KVC操作,这也是为什么要把数组封装成类。

数组变化调用方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    if([keyPath isEqualToString:@"arr"]){
        NSLog(@"数组发生了变化!!");
        //...
    }
}
//可以看到这里还有object 和 change(dict) 可以提供很多操作手段

注意KVO的取消,取消操作位置不当容易造成程序崩溃o(╯□╰)o~
比较妥当的方式就是 :

//去除kvo
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [self.picarr removeObserver:self forKeyPath:self.PIC_ARR_KEY context:nil];

}
//添加kvo
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.picarr addObserver:self forKeyPath:self.PIC_ARR_KEY options:NSKeyValueObservingOptionNew
     |NSKeyValueObservingOptionOld context:nil];
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章