引子

1. 什么是键值观察依赖键,可参考文章[深入浅出Cocoa]详解键值观察(KVO)及其实现机理 中第4点。

2.由于本人在学习[深入浅出Cocoa]详解键值观察(KVO)及其实现机理 过程中,对键值观察依赖键有些不解,固做此笔录。

键值观察依赖键的简单代码实现

我们在上一篇cocoa 自动键值观察(KVO)--笔录 的基础上,对其代码进行修改:

1.添加Other.h 和Other.m文件,目的是想把Other对象的num键作为Target对象age键的依赖键。

//
//  Other.h
//  test_kvo_can_del
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>@interface Other : NSObject
@property int num;  //添加变量num,作为依赖键
@end
//
//  Other.m
//  test_kvo_can_del
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import "Other.h"@implementation Other
@synthesize num;@end

2.修改Target类

1) 添加other指针,并合成访问器。

//
//  Target.h
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>
#import "Other.h"@interface Target : NSObject
@property   int age;  // for auto KVO
@property Other * other; //新添加指针,这个指针必须要有@end

在被观察者Targer类中添加如下类方法(注意,方法的名字是不固定的),作用是指明依赖关系。即Age属性依赖于other的num属性

<pre name="code" class="objc">//
//  Target.m
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import "Target.h"@implementation Target
@synthesize age;    // for auto KVO
@synthesize other;+ (NSSet *)keyPathsForValuesAffectingAge
{NSSet * keyPaths = [NSSet setWithObjects:@"other.num", nil]; //注意这里的other.num 写法是严格要求的,名字要与头文件声明的指针other一致!return keyPaths;
}@end

注:other.num 中的other不是随便写的,是要遵循那个什么KVC-Compliant 规则的, 这里的“other”名字要与头文件声明的"other"指针的名字一致!

3.修改main函数

//
//  main.m
//  AutoKVO
//
//  Created by fenglh on 14-7-31.
//  Copyright (c) 2014年 yons. All rights reserved.
//#import <Foundation/Foundation.h>
#import "Observer.h"
#import "Target.h"
#import "Other.h"
int main(int argc, const char * argv[])
{@autoreleasepool {Observer *observer = [[[Observer alloc] init] autorelease];
<span style="white-space:pre"></span><pre name="code" class="objc" style="font-size: 11px; text-align: left; "><span style="white-space:pre"> </span>Other * other = [[[Other alloc] init] autorelease]; //新增1

Target * target = [[[Target alloc] init] autorelease];

<span style="white-space:pre">  </span>//这里用来初始化,target.other的值。最好的办法,我们可以重写Target类的init方法,直接构造对象的时候就初始other的值了。target.other = other; //新增2[target.other retain];//新增3[target addObserver:observer forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:[Target class]];//[target setAge:500]; //注释掉原有的[other setNum:5000];  //新增4[target removeObserver:observer forKeyPath:@"age"];}return 0;
}

上面只是新增了4处代码,

1)1是实例化一个other对象

2)2和3只是为了初始化other对象

3)4调用other对象的setNum方法,即修改依赖键num的值

4.运行代码,输出结果:

2014-07-31 07:01:34.839 test_kvo_can_del[28802:303]  >> class : [Target] , Age changed
2014-07-31 07:01:34.840 test_kvo_can_del[28802:303]  >> old age is 0
2014-07-31 07:01:34.842 test_kvo_can_del[28802:303]  >> old age is 0

可以看到当我们对other对象的num值进行修改时(注意,我们的被观察者是target而不是other),仍然会触发Observer的observeValueForKeyPath 函数来处理变更通知。

所以,这就是键值观察依赖键的作用了。(至于为什么输出都是0,是随便打印的)

5.小结:

实现键值观察依赖键实现要素:

1)实现keyPathsForValuesAffectingXXXX 的方法,来指明依赖键是那些。

2)在被观察者类Target加入一个指向依赖键所在类Other的指针 ,如Target类中添加:@propertyOther * other; //新添加指针

3)第2点所说的指针名字“other”要与keyPathsForValuesAffectingXXXX方法里面的other名字一致!否则不遵循KVO-Compliant准则。

注:代码不算完整,只是用来验证键值观察依赖键的实现。应该还有许多不足之处,多多指教。

参考文章:

[深入浅出Cocoa]详解键值观察(KVO)及其实现机理

cocoa 键值观察依赖键(KVO)--笔录相关推荐

  1. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 本文转载至    罗朝辉 (http://www.cppblog.com/kesalin/) 本文遵循"署名-非商业用途-保持一致& ...

  2. python字典的键可以用列表吗_python字典多键值及重复键值的使用方法(详解)

    在Python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: ...

  3. python 字典键值重复_浅谈python字典多键值及重复键值的使用

    在python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: ...

  4. php 二维数组根据键值合并二维数组_php数组实现根据某个键值将相同键值合并生成新二维数组的方法详解...

    这篇文章主要介绍了php数组实现根据某个键值将相同键值合并生成新二维数组的方法,涉及php数组的遍历.赋值相关运算技巧,需要的朋友可以参考下 本文实例讲述了php数组实现根据某个键值将相同键值合并生成 ...

  5. php 判断键值重复合并,php数组实现根据某个键值将相同键值合并生成新二维数组的方法...

    本文实例讲述了php数组实现根据某个键值将相同键值合并生成新二维数组的方法.分享给大家供大家参考,具体如下: 源数据: $infos = array( array( a => 36, b =&g ...

  6. fastjson查找指定键值_分布式键值存储 etcd

    引言 前面的文章中,介绍了基于Paxos的ZooKeeper,本文将介绍另一种分布式一致性算法Raft的工业级实现----etcd,它们虽然实现方案不同,但是最终的实现效果都很像,而且etcd相较于Z ...

  7. python输出键值列表_Python 键值分组或分区数据

    Python 使用键值分组或者分区数据,对分组后的数据做何种归约是没有限制的.数据中可能包含一些自变量或者因变量.可以通过自变量对数据进行分区,然后计算每个分区的各项汇总值,包括最大值.最小值.平均值 ...

  8. linux的自定义input,linux键值到Android键值的转换与自定义

    首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息 fra ...

  9. python方向键键值_python字典键值对的添加和遍历方法

    添加键值对 首先定义一个空字典 >>> dic={} 直接对字典中不存在的key进行赋值来添加 >>> dic['name']='zhangsan' >> ...

  10. oracle修改外键值,ORACLE 外键约束修改行为

    Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 在SQL92标准中定义了几种外键改变后,如何处理子表 ...

最新文章

  1. spring事件驱动模型--观察者模式在spring中的应用
  2. Help:立体图绘制以及根据X,Y,Z三坐标值,在图上描点
  3. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
  4. leetcode_median of two sorted arrays
  5. iPhone程序中的加密处理
  6. 泊松分布的理解与Python仿真
  7. [iOS开发]autolayout自动布局
  8. IDEA toString方法输出JSON格式
  9. msxml6_x86.msi和msxml6_ia64.msi和msxml6_x64.msi的选择
  10. html双线型边框线怎么设置,Word文字边框双线条怎么设置
  11. 不要重新发明轮子_重新发明轮子
  12. canvas的width和style.width的区别
  13. slam入门——十四讲笔记(一)
  14. 哥德尔预言无穷小微积分是未来的数学分析
  15. 如何在云服务器粘贴文件,云服务器粘贴文件
  16. xinetd使用指南
  17. 沈阳大雨部分地区积水情况
  18. 消费新品周报 | TCL发布中国首款可旋转智慧大屏;麦卢卡蜂蜜品牌BEE+登陆中国...
  19. 【数据分享】第六次、第七次人口普查深圳各街道数据
  20. RPA:企业信息孤岛的“克星”

热门文章

  1. SQL server日志清理
  2. Vuejs路由出现‘login/12/login/12/login/12/test’重复地址的解决办法
  3. Android——支持图片加视频无限轮播的banner
  4. SQLServer之修改PRIMARY KEY
  5. 服务器装系统出现命令提示符,怎么通过cmd命令提示符重装系统?具体怎么操作?...
  6. 非常简单的四子棋【java编写】
  7. 百度员工离职总结:如何做个好员工?(严重推荐)
  8. 测试和开发之间的博弈--没有硝烟的战争
  9. DC-DC升压IC测试及EN脚讲解
  10. 中兴承建沃商店共度周年庆