点名主题 :
kvo就是一个类来监听另外一个类的变量,当变量发生改变的时候来通知这个类。
举个例子:
创建一个人的类,人的类中有一个银行卡;创建一个银行卡的类,银行卡的类中有一个钱的变量;
我们来用人的类来监听银行卡中的钱数,当银行卡中的钱数发生改变的时候来通知人;
下面我们来实现这个例子;
新建一个
创建一个person类
person.h
#import <Foundation/Foundation.h>
@class BankCard;
@interface Person : NSObject
{
BankCard *bancard;//银行卡
}
@end
person.m
#import "Person.h"
#import "BankCard.h"
@implementation Person
//重写初始化函数
-(id) init
{
self = [super init];
if(self)
{
bancard = [[BankCard alloc]init];
//添加一个监听 监听的变量为 bancard 中得money的变量 旧的值和新的值
[bancard addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}
return self;
}
//当监听的值发生改变的时候自动调用该方法
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqual:@"money"])
{
NSString *new = [change objectForKey:@"old"];
NSString *old =[change objectForKey:@"new"];
NSLog(@"%@ %@",new,old);
}
}
@end
银行卡类:
BankCard.h
#import <Foundation/Foundation.h>
@interface BankCard : NSObject
@property (nonatomic,assign) float money;
@end
BankCard.m
#import "BankCard.h"
@implementation BankCard
-(id)init
{
self = [super init];
if(self)
{
_money=10.0f;
//这里用了定时器,看不懂没关系,知道意思就行,就是每隔1秒调用一下balanceUpdate这个函数来改变money的值,以便我们来观察是否监听成功;
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(balanceUpdate) userInfo:nil repeats:YES];
}
return self;
}
-(void) balanceUpdate
{
float f = self.money;
f += arc4random()%100;//产生一个0-99 的随机数
self.money = f;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Person *p = [[Person alloc]init];
[[NSRunLoop currentRunLoop]run];
}
return 0;
}
运行结果:
2014-07-25 21:51:32.210 IOS KVO[3388:303] Hello, World!
2014-07-25 21:51:33.214 IOS KVO[3388:303] 10 93
2014-07-25 21:51:34.213 IOS KVO[3388:303] 93 154
2014-07-25 21:51:35.214 IOS KVO[3388:303] 154 182
2014-07-25 21:51:36.213 IOS KVO[3388:303] 182 214
2014-07-25 21:51:37.213 IOS KVO[3388:303] 214 307
2014-07-25 21:51:38.213 IOS KVO[3388:303] 307 358
2014-07-25 21:51:39.213 IOS KVO[3388:303] 358 404
2014-07-25 21:51:40.213 IOS KVO[3388:303] 404 493
2014-07-25 21:51:41.213 IOS KVO[3388:303] 493 542
Program ended with exit code: -1
参考自千锋视频。