NSArray,NSMutableArray的KVO操作
2015-10-24 10:00
363 查看
KVO(Key Value Observe),键值观察,一种典型的观察者模式。iOS另一个观察者模式Notification,不过这个要在消息中心注册,相比而言比较麻烦。
建立KVO的三个步骤:
1、注册要监控的对象属性addObserver:forKeyPath:options:context:
2、observeValueForKeyPath:ofObject:change:context:,当观察的属性变化时会调用该方法
3、取消注册观察removeObserver:forKeyPath:context:
注意,理论上KVO只能对对象属性才有效,所以如果要KVC数组,必须将其转换为对象属性,直接的作法就是直接构造一个继承nsobject的类,将数组作为类中的属性。
然后按照上面的步骤添加监控,监控者就是对象所在的control,也就是self,key就是对应的数组名称:
数组的增减必须以下形式:
mutableArrayValueForKey KVC的数组取值方式,要实现KVO必须通过KVC对数据进行操作,一般情况下,数组是没有KVC操作,这也是为什么要把数组封装成类。
数组变化调用方法:
注意KVO的取消,取消操作位置不当容易造成程序崩溃o(╯□╰)o~
比较妥当的方式就是 :
建立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]; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音
- 解析iOS开发中的FirstResponder第一响应对象