OC KVO

1. KVO 是什么?

KVO是OC观察者模式的一种实现(另一种是NSNotification);

KVO提供一种机制, 制定一个被观察对象(例:Person类), 当对象某个属性(例:name)发生改变时, 对象会获得通知, 并作出相应的处理; 且不需要给被观察对象添加任何代码.

在MVC架构下的项目, KVO机制很适合实现Model和View之间的通讯.

例: 在model_B创建属性数据, 在控制器中创建观察者, 一旦属性数据发生改变观察者就收到通知, 通过KVO在控制器使用回调方法实现view_C的更新.

2. 基本实现原理

当观察某对象A时, KVO机制会动态创建一个对象A的子类NSKVONotifying_A, 并为这个新类重写被观察属性name(即keyPath)的setter方法. setter方法随后负责通知观察对象属性的变化.

3. 特点

观察者观察的是属性, 只有遵循KVO变更属性的方式才会执行KVO的回调方法, 即是否执行科setter方法或者是否使用了KVC赋值. 如果没有, 而是直接修改属性对应的成员变量(_name = @"花花")是不会触发KVO机制的. 所以, 使用KVO机制的前提是遵循KVO的属性设置方式来变更属性值.

4. 应用

self.myKVO=[[myKVO alloc]init];

/*1.注册对象myKVO为被观察者: option中, 

NSKeyValueObservingOptionOld 以字典的形式提供 “初始对象数据”;

NSKeyValueObservingOptionNew 以字典的形式提供 “更新后新的数据”; */

[self.myKVO addObserver:selfforKeyPath:@"num" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];

/* 2.只要object的keyPath属性发生变化,就会调用此回调方法,进行相应的处理:UI更新:*/

-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString*,id>*)change context:(void*)context{

// 判断是否为self.myKVO的属性“num”:

if([keyPath isEqualToString:@"num"]&&object==self.myKVO){

    // 响应变化处理:UI更新(label文本改变)

    self.label.text=[NSString stringWithFormat:@"当前的num值为:%@",[change valueForKey:@"new"]];

    //change的使用:上文注册时,枚举为2个,因此可以提取change字典中的新、旧值的这两个方法  

     NSLog(@"\\noldnum:%@ newnum:%@",

    [change valueForKey:@"old"],

    [change valueForKey:@"new"]);

  }

}

/*KVO以及通知的注销,一般是在-(void)dealloc中编写。

至于很多小伙伴问为什么要在didReceiveMemoryWarning?因为这个例子是在书本上看到的,所以试着使用它的例子。

但小编还是推荐把注销行为放在-(void)dealloc中。(严肃脸😳)

*/

-(void)didReceiveMemoryWarning{[superdidReceiveMemoryWarning];

/* 3.移除KVO */

[self.myKVO removeObserver:selfforKeyPath:@"num"context:nil];

}

//按钮事件

-(IBAction)changeNum:(UIButton*)sender{

//按一次,使num的值+1

self.myKVO.num=self.myKVO.num+1;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • KVO是什么 kvo:Key-Value Observing(键值观察),键值观察是一种机制,它允许将其他对象的指...
    浪的出名阅读 544评论 0 2
  • KVC: 定义: KVC全称是Key Value Coding(键值编码),是一个基于NSKeyValueCodi...
    飞哥漂流记阅读 1,168评论 0 0
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,705评论 0 4
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,117评论 2 9
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,227评论 0 13