首页 > 代码库 > iOS 键值观察(KVO)简述及实例理解
iOS 键值观察(KVO)简述及实例理解
KVO概述: KVO,即:Key-Value Observing,直译为:基于键值的观察者。 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。 简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
KVO的优点: 当有属性改变,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。 这是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。 开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可以在工程里使用。 其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同 一个属性,以及相关的值。
使用步骤如下: 1. 注册,指定被观察者的属性 -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型) 2. 实现回调方法 -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。 是自动调用的,只要你所监听对象的属性或者实例变量发生变化,就自动调用该函数,执行相应操作 3. 触发回调方法 实例理解代码
#import "ViewController.h" @interface ViewController () @end @implementation ViewController { NSString *kkk; NSMutableDictionary *xxx; } - (IBAction)btntest:(id)sender { [self setValue:@"222" forKey:@"kkk"]; NSMutableDictionary *ccc = [[NSMutableDictionary alloc] init]; [ccc setObject:@"v" forKey:@"k"]; [self setValue:ccc forKey:@"xxx"]; } - (void)viewDidLoad { [super viewDidLoad]; xxx = [[NSMutableDictionary alloc] init]; [self setValue:@"111" forKey:@"kkk"]; [self addObserver:self forKeyPath:@"kkk" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; NSMutableDictionary *zzz = [[NSMutableDictionary alloc] init]; [self setValue:zzz forKey:@"xxx"]; [self addObserver:self forKeyPath:@"xxx" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"kkk"]) { NSString *old = [change valueForKey:@"old"]; NSString *new = [change valueForKey:@"new"]; NSLog(@"old=%@,new=%@", old, new); } if([keyPath isEqualToString:@"xxx"]) { NSMutableDictionary *old = [change valueForKey:@"old"]; NSMutableDictionary *new = [change valueForKey:@"new"]; NSLog(@"old=%ld,new=%ld,xxx=%ld", [old count], [new count], [xxx count]); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
iOS 键值观察(KVO)简述及实例理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。