点名主题 :
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
参考自千锋视频。
oc 语法 kvo
时间: 2024-11-08 07:15:46