【Objective-C】OC中KVO的基本概念和使用方法

基本概念:

       键值观察是一种使用获取其他对象的特定属性变化的通知机制。

控制器层的绑定技术就是严重依赖键值观察获得模型层和控制器层的变化通知的。

对于不依赖控制器层类的应用程序,键值观察提供了一种简化的方法来实现检查器

并更新用户界面值。

       与NSNotification不同,键值观察中并没有所谓的中心对象来为所有观察者提供

变化通知。取而代之的,当有变化发生时,通知呗直接发送至处于观察状态对象。

NSObject提供这种基础的键值观察实现方法,你几乎不用重写这些方法。

      可以观察任何对象属性,包括基本数据类型属性,对一或是对多关系。对多关系

的观察者将会被告知发生变化的类型,也就是任意发生变化的对象。

     键值观察为所有对象提欧诺个自动观察兼容性,你可以通过禁用通过并实现手动

通知来筛选通知。


注册观察者:

      为了正确接受属性的变更通知,观察对象必须首先发送一个

addObserver:forKeyPath:options:context:消息至被观察对象,用以传送观察对象和需要

观察的属性的关键路径,以便与其注册。选项参数指定了发送变更通知时提供给观察者的

信息。使用NSKeyValueObservingOptionsOld选择可以将初始对象值以变更字典中的一个项

的形式提供给观察者。指定NSKeyValueObservingOptionsNew选择可以将新的值以一个项

的形式添加至变更字典。你可以使用逐位“|”这两个常量来指定接受上述两种类型的值。

实例如下:

          [person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld

          |NSKeyValueObservingOptionNew context:nil];
接下来看个实例:

Nurse.h头文件:

#import <Foundation/Foundation.h>
@class Person;
@interface Nurse : NSObject
@property(nonatomic,retain)Person *person;
-(id)initWithPerson:(Person *)person;

@end
Nurse.m实现文件:

#import "Nurse.h"
#import "Person.h"
@implementation Nurse

-(id)initWithPerson:(Person *)person{
    self=[super init];
    if(self!=nil){
        _person=[person retain];
        [_person addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    }
    return  self;
}

//实现非正式协议方法  
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSLog(@"%@",change);
}
-(void)dealloc{
    [_person release];
    [super dealloc];
}
@end
Person.h头文件:

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic,assign)NSUInteger happyVal;
@end
Person.m头文件:

#import "Person.h"

@implementation Person

-(id)init{
    self=[super init];
    if(self!=nil){
        self.happyVal=100;
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
    }
    return self;
}
-(void)timeAction:(NSTimer *)timer{
    self.happyVal--;
}
@end
main.m测试文件:

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Nurse.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Person *person=[[Person alloc]init];
        Nurse *nurse=[[Nurse alloc]initWithPerson:person];
        [[NSRunLoop currentRunLoop]run];
        
    }
    return 0;
}
运行截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值