IOS开发-OC学习-kvc,kvo
2016-03-28 14:53
489 查看
kvc是用来方便的设置实例的属性值的,比如person类的实例p1有一个name的属性,那么我们可以通过kvc去设置p1的name,语法是:
[ 对象 setValue:@"xiaming" forKey:@"name"];其中xiaoming就是p1的name,这个就相当于用点语法给p1设置name:p1.name = @"xiaoming";
以上就是kvc的简单实用。接下来是kvo,kvo是键值观察,如果我想知道某个值,是否变化,变成什么,不可能一直去访问人家然后进行对比看有没有变化。在xcode中有一个方法用来方便的知道我们要观察的值是否变化,并在变化了之后触发响应的事件,具体操作如下:
假如我想知道某个累的name属性和age 属性是否变化,并在变化后触发响应的处理方法,就要先添加观察者:
以上代码添加了两个需要观察的值,分别是name和age,其中后面的context是我们后期使用kvo时用来区别究竟是name改变还是age改变才触发的kvo。添加了观察者之后,我们需要在程序运行的时候name和age 自动变化,那只好设置一个定时器喽:
声明定时器:
设置定时器的频率和触发的方法:(设置1.5s触发一次,触发haha:方法)
设置完成后我们需要实现定时器中的haha:方法:
在这个方法中我们随机给name和age赋值。
接下来就是设置键值观察:也就是当检测到我们观察的两个属性值改变时该如何处理:
以上键值观察中通过if判断响应函数读入的context生成的字符串contextString去判断是由哪个所观察的键值改变后触发的kvo,然后根据情况进行处理,如果观察的键值多的话可以用switch case语句进行判断执行。还有另一种方法去判断是哪个观察者触发的:
也就是通过Keypath去判断。因为我们在添加观察者的时候已经设定了不同的keypath有不同的字符串属性。
释放观察者:
执行结果为;
[ 对象 setValue:@"xiaming" forKey:@"name"];其中xiaoming就是p1的name,这个就相当于用点语法给p1设置name:p1.name = @"xiaoming";
以上就是kvc的简单实用。接下来是kvo,kvo是键值观察,如果我想知道某个值,是否变化,变成什么,不可能一直去访问人家然后进行对比看有没有变化。在xcode中有一个方法用来方便的知道我们要观察的值是否变化,并在变化了之后触发响应的事件,具体操作如下:
假如我想知道某个累的name属性和age 属性是否变化,并在变化后触发响应的处理方法,就要先添加观察者:
// 设置两个观察者观察name和age的值是否变化 [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"name"]; [self addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:@"age"];
以上代码添加了两个需要观察的值,分别是name和age,其中后面的context是我们后期使用kvo时用来区别究竟是name改变还是age改变才触发的kvo。添加了观察者之后,我们需要在程序运行的时候name和age 自动变化,那只好设置一个定时器喽:
声明定时器:
NSTimer *timenow;
设置定时器的频率和触发的方法:(设置1.5s触发一次,触发haha:方法)
1 timenow = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(haha:) userInfo:nil repeats:YES];
设置完成后我们需要实现定时器中的haha:方法:
//定时器方法 -(void)haha:(id)sender{ NSString *outString = [NSString stringWithFormat:@"current%d",arc4random()%100]; self.name = outString; self.age = outString; }
在这个方法中我们随机给name和age赋值。
接下来就是设置键值观察:也就是当检测到我们观察的两个属性值改变时该如何处理:
//设置键值观察,也就是观察值改变的时候所触发的方法。 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSString *contextString = [NSString stringWithFormat:@"%@",context]; if ([contextString isEqualToString:@"age"]) { NSLog(@"ageobser%@",[change objectForKey:@"new"]); }else{ NSLog(@"nameobser%@",[change objectForKey:@"new"]);//打印有变化的信息中的new值,也就是变化后的值 } // NSLog(@"%@",change);// 打印所有变化的相关信息 }
以上键值观察中通过if判断响应函数读入的context生成的字符串contextString去判断是由哪个所观察的键值改变后触发的kvo,然后根据情况进行处理,如果观察的键值多的话可以用switch case语句进行判断执行。还有另一种方法去判断是哪个观察者触发的:
if ([keyPath isEqualToString:@"name"]) { NSLog(@"nameobser%@",[change objectForKey:@"new"]); }else{ NSLog(@"ageobser%@",[change objectForKey:@"new"]); }
也就是通过Keypath去判断。因为我们在添加观察者的时候已经设定了不同的keypath有不同的字符串属性。
释放观察者:
//移除观察者 -(void)dealloc{ [self removeObserver:self forKeyPath:@"name"]; [self removeObserver:self forKeyPath:@"age"]; }
执行结果为;
2016-03-28 14:18:39.057 FirstLessonOfUI[2959:66837] nameobsercurrent84 2016-03-28 14:18:39.058 FirstLessonOfUI[2959:66837] ageobsercurrent84 2016-03-28 14:18:40.558 FirstLessonOfUI[2959:66837] nameobsercurrent36 2016-03-28 14:18:40.558 FirstLessonOfUI[2959:66837] ageobsercurrent36 2016-03-28 14:18:42.058 FirstLessonOfUI[2959:66837] nameobsercurrent51 2016-03-28 14:18:42.059 FirstLessonOfUI[2959:66837] ageobsercurrent51 2016-03-28 14:18:43.557 FirstLessonOfUI[2959:66837] nameobsercurrent99 2016-03-28 14:18:43.558 FirstLessonOfUI[2959:66837] ageobsercurrent99 2016-03-28 14:18:45.058 FirstLessonOfUI[2959:66837] nameobsercurrent99 2016-03-28 14:18:45.058 FirstLessonOfUI[2959:66837] ageobsercurrent99
相关文章推荐
- iOS APNS远程推送(史上最全步骤)
- alamofire GET请求带中文参数遇到的问题
- iOS开发的一些奇巧淫技
- iOS调试之 crash log分析
- iOS 开发中常用的第三方下载地址整理
- IOS多线程实现多图片下载(一)
- iOS开发中WebP格式的64位支持处理
- IOS开发-OC学习-Info.plist文件解析
- iOS开发保持用户登录状态-NSUserDefault实现数据持久化
- IOS多线程实现多图片下载(二)
- 计算两个经纬度之间的距离
- 6.1iOS异常捕捉,日志组件
- iOS NSClassFromString 详解
- 67.iOS严谨单例写法/可继承单例
- cornerstone使用指南
- iOS可执行文件瘦身方法
- 关于iOS开发内存管理的那些事儿
- iOS 生成二维码
- iOS 中Block的正确使用避免循环引用和Crash
- RADASM中使用DOSBOX来运行DOS/BIOS程序(16位)