/**********************Person*******************************/
/*使用Person监听bank的成员变量:opening的变化,
其中添加了一个定时器,每过一秒就会启动指定的方法一次
*/
Person.h
#import <Foundation/Foundation.h>
@class Bank;
@interface Person : NSObject
{
Bank *bank;
}
@property(nonatomic)Bank *bank;
//打开监听器
-(void)registerVS;
@end
Person.m
#import "Person.h"
#import "Bank.h"
@implementation Person
-(id)init{
if (self = [super init]) {
bank = [[Bank alloc] init];
}
return self;
}
//产生一个随机的指针:BankCount
//指向自己的指针:
static void *BankCount = (void *)&BankCount;
-(void)registerVS{
[bank addObserver:self forKeyPath:@"opening" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:BankCount];
/*
给银行账户“bank”增加一个监听者self,监听银行账户的成员变量:“opening”
只要“opening”的值改变就会让self知道,
*/
}
//监听的回调函数:
//只要opening有变化就调用下面的函数
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
/*
"kepat"表示之前的Key-“opening”,
“object”表示之前的对象-“bank”;
“Change”是一个包含 新、旧值的字典;
context 是私有变量:BankCount;
*/
NSLog(@"object = %@ keypath = %@",object,keyPath);
//下面的判断可以换成:[keypath isEqualToString:@"opening"];
if (context == BankCount) {
NSString *str = [change objectForKey:NSKeyValueChangeNewKey];
NSLog(@"%@",str);
}
else{
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
@end
/**********************Bank*******************************/
Bank.h
#import <Foundation/Foundation.h>
@interface Bank : NSObject
{
float _opening;
}
@property(nonatomic) float opening;
-(void)BankUpdata:(id)obj;
-(void)Update:(float)opening;
@end
Bank.m
#import "Bank.h"
@implementation Bank
-(id)init{
if (self = [super init]) {
//定时器:每个1秒执行一次,
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(BankUpdata:) userInfo:nil repeats:YES];
//防止定时器关闭,
//[[NSRunLoop currentRunLoop] run];
//BankUpdata的参数是NSTimer的对象!!
}
return self;
}
-(void)BankUpdata:(id)obj{
float f = self.opening;
f+=arc4random()%100;
self.opening = f;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Bank.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *per = [[Person alloc] init];
[per registerVS];
[[NSRunLoop currentRunLoop] run];
}
return 0;
}