[ios基础] KVO观察者模式,实用分析
2015-11-28 14:34
459 查看
KVO:Key - Value - Observer
全名:观察者模式
它是一个基于KVC的事件回调方式;
KVC和KVO不是同一个层次的东西,因为他们的目的不一样,所以面试官问起他们的区别,只需要回答压根就没有什么可比较的,因为实现的目的就不一样。
KVO是指添加一个第三方观察者,去坚挺一个key的value是否有变化,当key的value变化后,就会执行一个方法中的代码。
KVO大量消耗系统资源,如果你想在事件回调中使用kvo,可以参考网上“事件回调”相关文章
使用方法:
系统框架已经支持KVO,所以程序员在使用的时候非常简单:
1.注册,指定观察者的属性
- (void)viewDidLoad
{
[super viewDidLoad];
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
myLabel.textColor = [UIColor redColor];
myLabel.text = [stockForKVO valueForKey:@"price"];
[self.view addSubview:myLabel];
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(0, 0, 100, 30);
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:b];
}
2.实现回调方法法,重写方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:@"price"];
}
}
3.移除观察
- (void)dealloc
{
[super dealloc];
[stockForKVO removeObserver:self forKeyPath:@"price"];
[stockForKVO release];
}
全名:观察者模式
它是一个基于KVC的事件回调方式;
KVC和KVO不是同一个层次的东西,因为他们的目的不一样,所以面试官问起他们的区别,只需要回答压根就没有什么可比较的,因为实现的目的就不一样。
KVO是指添加一个第三方观察者,去坚挺一个key的value是否有变化,当key的value变化后,就会执行一个方法中的代码。
KVO大量消耗系统资源,如果你想在事件回调中使用kvo,可以参考网上“事件回调”相关文章
使用方法:
系统框架已经支持KVO,所以程序员在使用的时候非常简单:
1.注册,指定观察者的属性
- (void)viewDidLoad
{
[super viewDidLoad];
stockForKVO = [[StockData alloc] init];
[stockForKVO setValue:@"searph" forKey:@"stockName"];
[stockForKVO setValue:@"10.0" forKey:@"price"];
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
myLabel.textColor = [UIColor redColor];
myLabel.text = [stockForKVO valueForKey:@"price"];
[self.view addSubview:myLabel];
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
b.frame = CGRectMake(0, 0, 100, 30);
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:b];
}
2.实现回调方法法,重写方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"price"])
{
myLabel.text = [stockForKVO valueForKey:@"price"];
}
}
3.移除观察
- (void)dealloc
{
[super dealloc];
[stockForKVO removeObserver:self forKeyPath:@"price"];
[stockForKVO release];
}
相关文章推荐
- iOS中常用的正则表达式
- 【ios基础】KVC大白话介绍篇
- 华硕开机自动进入bios(最终解决方案)
- [ios基础]大白话解释分类和扩展
- (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块
- (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块
- (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块
- iOS MRC手动内存管理 心得体会
- iOS 蓝牙
- iOS开发中关于import头文件放置位置的tips
- ios开发必看的博客汇总
- {iOS} 出iOS越狱渠道ipa包的方法
- iOS 代码规范
- 在iOS设备上进行抓包
- iOS沙盒路径的查看和使用
- iOS 开发技巧收集整理
- IOS开发技术之合理利用类的类别
- iOS 禁止锁屏
- iOS在纯代码中使用AutoLayout添加约束
- (NO.00004)iOS实现打砖块游戏(二):实现游戏主界面动画