首页 > 代码库 > oc 语法 kvo

oc 语法 kvo

点名主题 :

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

参考自千锋视频。