你的位置:首页 > 操作系统

[操作系统]iOS.OC.03 KVO


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

 

如有错误,请不吝赐教,必改之。