KVC&KVO&NSNotification

KVC,便是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之一。架构

一个对象拥有某些属性。好比说,一个 Person 对象有一个 name 和一个 age 属性。以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 address 的 key。 key 只是一个字符串,它对应的值能够是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另外一个是获取 key 的值。以下面的例子:框架

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property(nonatomic,strong)Person* p;
@end
@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.p=[[Person alloc]init];
    self.p.father=[[Person alloc]init];
    
    //KVC 演示
    [self.p setValue:@"mrzhang" forKey:@"name"];
    [self.p setValue:@"laozhang" forKeyPath:@"father.name"];
    
    NSString* name=[self.p valueForKey:@"name"];

    
    NSLog(@"person:name:%@ father name:%@",name,self.p.father.name);
}

使用plist 来加载,直接能够对 对象里的实例进行赋值或读取post

Person.hatom

person.plist 文件以下图spa

 

   NSString* path=[[NSBundle mainBundle] pathForResource:@"person" ofType:@"plist"];
    
    NSArray * arr=[NSArray arrayWithContentsOfFile:path];
    
   //能够直接取father 属性 不须要咱们先实例出Father对象
    NSLog(@">>>%@", [arr valueForKeyPath:@"father.name"]);

 

K-V 的形式取值或赋值减少了耦合度key 与 key path 要区分开来,key 能够从一个对象中获取值,而 key path 能够将多个 key 用点号 “.” 分割链接起来设计

 

 KVO:code

        当指定的对象的属性被修改了,容许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者server

 KVO的优势:
当 有属性改变,KVO会提供自动的消息通知。这样的架构有不少好处。首先,开发人员不须要本身去实现这样的方案:每次属性改变了就发送消息通知。这是KVO 机制提供的最大的优势。由于这个方案已经被明肯定义,得到框架级支持,能够方便地采用。开发人员不须要添加任何代码,不须要设计本身的观察者模型,直接可 以在工程里使用。其次,KVO的架构很是的强大,能够很容易的支持多个观察者观察同一个属性,以及相关的值。
KVO如何工做:
须要三个步骤来创建一个属性的观察员。理解这三个步骤就能够知道KVO如何设计工做的。 对象

(1)首先,构思一下以下实现KVO是否有必要。好比,一个对象,当另外一个对象的特定属性改变的时候,须要被通知到。
例 如,A对象但愿可以觉察到B对象的age属性的任何变化。 blog

(2)那么 A必须发送一个“addObserver:forKeyPath:options:context:”消息,注册成为 B属性的观察者。(说 明:“addObserver:forKeyPath:options:context:”方法在指定对象实例之间创建了一个链接。注意,这个链接不是两 个类之间创建的,而是两个对象实例之间创建的。) 

【被监听对象 addObserver 监听者 forKeyPath 被监听对象的属性 options监视内容(新值或旧值)context额外信息】;

(3)为了可以响应消息,观察者必须实现 “observeValueForKeyPath:ofObject:change:context:”方法。这个方法实现如何响应变化的消息。在这个方 法里面咱们能够跟本身的状况,去实现应对被观察对象属性变更的相应逻辑。 

(4)假如遵循KVO规则的话,当被观察的属性改变的话,方法 “observeValueForKeyPath:ofObject:change:context:”会自动被调用。

 须要强调的是KVO的回调要被调用,属性必须是经过KVC的方法来修改的,若是是调用类的其余方法来修改属性,这个观察者是不会获得通知的。

 

NSNotification:

 

一、监听通知

【center addObserver :监听者 selector:须执行的方法 name:所监听者通知的名称 object:通知发送者】;

二、通知中心发布消息

【center PostNotificationName:@“test”object:@"11"】;

 

for example:

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test:) name:@"testNotice" object:@"test"];
    
    [[NSNotificationCenter defaultCenter]postNotificationName:@"testNotice" object:@"test"];
}

-(void)test:(NSNotification*)noti{
    NSLog(@"name:%@,object:%@",noti.name,noti.object);
    
}

 

 总结:KVO与NSNotification

相同点:均可以经过addObserver 方法来监听,都是能经过监听得到处理

不一样点:触发点不同   KVO在属性上经过 K-V 发生改变时,自动调用observeValueForKeyPath方法

而NSNotification 在须要的时候 发送通知才调用,且方法自定义

本站公众号
   欢迎关注本站公众号,获取更多信息