标签:
KVO Key,Value,Observing,即键值观察者。它提供了这样一种机制,当指定对象的属性发生改变时,KVO会自动通知相应的观察者。
它与NSNotification不同,键-值观察中并没有所谓的中心对象来为所有观察者 提供变化通知。取而代之地,当有变化发生时,通知被直接发送至处于观察状态的对象。
三个步骤:注册观察者,接收变更通知,移除观察者。实例如下:
创建一个工程,创建两个类,一个Baby,一个Mother。Baby有一个属性hungryNum,叫饥饿值吧,当饥饿值改变的时候mother接收饥饿值变更。
Baby.h
#import <Foundation/Foundation.h>
@interface Baby : NSObject
@property(nonatomic,assign)NSInteger hungryNum;
@end
Mother.m
#import "Mother.h"
@implementation Mother
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"hungryNum"]) {
//每当监听的属性hungryNum改变时,打印hungryNum的当前值和之前值。
NSLog(@"%@ %@",[change objectForKey:@"new"],[change objectForKey:@"old"]);
}
}
@end
ViewController.m
#import "ViewController.h"
#import "Baby.h"//引入头文件
#import "Mother.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Baby * xiaoxiao=[[Baby alloc]init];//创建对象
Mother * xiaoMama=[[Mother alloc]init];
//注册观察者,xiaoxiao添加了观察者xiaoxiaoMama,观察hungryNum属性。
[xiaoxiao addObserver:xiaoMama forKeyPath:@"hungryNum" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
xiaoxiao.hungryNum=10;//给xiaoxiao的hungryNum属性附一个初值,用一个for循环使得该属性的值改变,每次值改变都会通知监听者。
for (xiaoxiao.hungryNum; xiaoxiao.hungryNum>0; xiaoxiao.hungryNum--) {
}
//移除观察者,注意:如果不移除,程序运行到此会奔溃。
[xiaoxiao removeObserver:xiaoMama forKeyPath:@"hungryNum"];
}
打印结果:
2015-03-21 17:11:29.735 OMG[2366:148640] 10 0
2015-03-21 17:11:29.736 OMG[2366:148640] 9 10
2015-03-21 17:11:29.736 OMG[2366:148640] 8 9
2015-03-21 17:11:29.736 OMG[2366:148640] 7 8
2015-03-21 17:11:29.736 OMG[2366:148640] 6 7
2015-03-21 17:11:29.736 OMG[2366:148640] 5 6
2015-03-21 17:11:29.736 OMG[2366:148640] 4 5
2015-03-21 17:11:29.737 OMG[2366:148640] 3 4
2015-03-21 17:11:29.737 OMG[2366:148640] 2 3
2015-03-21 17:11:29.737 OMG[2366:148640] 1 2
2015-03-21 17:11:29.737 OMG[2366:148640] 0 1
标签:
原文地址:http://www.cnblogs.com/ios-mengxiang/p/4355867.html