KVO Key-Value-Obsever 键值观察者

1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作

创建一个被观察者:

    self.person = [[Person alloc]init];

2.给被观察者注册观察者

NSKeyValueObservingOptionNew    当重新给被观察者的key值赋值时,触发监听方法,此时打印的 change 永远都是最新的值 存放的是value值

NSKeyValueObservingOptionOld      当重新给被观察者的key值赋值时,触发监听方法,此时打印的 change 永远都是上一次的旧值 存放的是value值

NSKeyValueObservingOptionInitial    当初始化被观察者对象或者重新给观察者对象赋值的时,此时走监听方法

NSKeyValueObservingOptionPrior      当被观察者的name属性赋值前后都会触发,notificationIsPrior = 1 标识赋值前后触发

第一个参数:注册的观察者对象

第二个参数:要观察的key路径

第三个参数:观察value值的变化情况

  [self.person addObserver:self forKeyPath:@"name" options:(NSKeyValueObservingOptionOld) context:nil];
    self.person.name = @"guoMeiMei";

监听方法:

触发的时机:一旦观察者发现被观察者的name key值对应的value值发生变化的时候就会自动调用这个方法

一般观察的key值对应的value变化时,我们要做的一些操作都写在这个方法中

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

    NSLog(@"%@",keyPath);
    NSLog(@"%@",object);
    NSLog(@"%@",change);

    //一旦key值对应的value改变,就修改value的背景颜色
    self.view.backgroundColor = [UIColor colorWithRed:kColorValue green: kColorValue blue: kColorValue alpha: 0.5];

}

Person类:

Person.h
@interface Person : NSObject
@property(nonatomic,copy)NSString *name;//名字
@property(nonatomic,copy)NSString *gender;//性别
@property(nonatomic,assign)NSInteger age;//年龄
@end

Person.m
@implementation Person
- (void)dealloc{
    self.name = nil;
    self.gender = nil;
    [super dealloc];
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

}

- (NSString *)description{
    return [NSString stringWithFormat:@"姓名:%@ 性别:%@ 年龄 %ld",_name,_gender,_age];
}
@end

改变属性值:

- (IBAction)setValue:(UIButton *)sender {
//    NSLog(@"改变属性值");
    //name属性的新值
    self.person.name = @"liangChen";

}

移除观察者:

- (IBAction)removeOberver:(UIButton *)sender {
//    NSLog(@"移除观察者");
    //观察完成之后要移除观察者,观察者只能被移除一次,第二次就会Crash
    [self.person removeObserver:self forKeyPath:@"name"];

}

效果展示:



iOS中 KVO 键值观察者的更多相关文章

  1. KVO 键值观察者

    KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...

  2. IOS中KVO模式的解析与应用

    IOS中KVO模式的解析与应用 最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修 ...

  3. KVO键值监听

    KVO 键值监听:当我想知道一个对象的属性是否发生改变的时候 做出响应,就需要添加监听keypath 和 key的区别keypath会自动寻找子类的属性key只会寻找当前类的属性添加键值监听[pers ...

  4. 使用KVO键值监听

    本文章从五个方面介绍KVO(Key-Value-Observer)键值观察者: (1)功能介绍 (2)使用步骤 (3)应用场景 (4)原理理解 (5)相关的面试题 一 功能介绍 KVO是OC语言对「观 ...

  5. 在C#中用Linq从属性文件中读取键值对Key-Value Pair

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中用Linq从属性文件中读取键值对Key-Value Pair.

  6. C语言定义从URL中获取键值的接口

    环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字). 头文件 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ #ifndef _HEAD_H_ # ...

  7. js中以键值对的形式当枚举

    js中以键值对的形式当枚举var Penum= { B: "姓名", C: "所属居委", D: "证件号", E: "性别&qu ...

  8. PHP如何根据数组中的键值进行排序

    主要是使用PHP的排序函数,asort()和arsort(). 为了减少代码的耦合性,我们将根据数组中的键值进行排序封装成一个函数 <?php $array = array( array(), ...

  9. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

随机推荐

  1. NVIDIA Titan Xp Star Wars Collector's Edition显卡深度学习工作站 + Ubuntu17.10 + Tensorflow-gpu + Anaconda3 + Python 3.6 设置

    为了能让 Tensorflow GPU 版本跑起来,我折腾了1个多星期. 总体参照 https://zhuanlan.zhihu.com/p/32118549 ,安装成功,但还是有不足的地方, 在此记 ...

  2. 关于熊猫认证软件IOS安装步骤教程(适用于其他软件)

    IOS运行企业版应用教程 1.扫描二维码之后微信进入界面,如下图所示:点击右上角三个点   2.弹出分享界面,如图所示:点击苹果自带浏览器(sarfari)     3.进入苹果自带浏览器后如图所示, ...

  3. linux C 刚初始化后的一个变量在调用一个静态库中函数后被异常修改为乱码

    linux C 中声明并初始化一个变量const char a[512]="test";后,接着调用了一个静态库中的函数函数test(b);,a并没有传入test函数,但在调用这个 ...

  4. linux下的静态库与动态库详解

    静态库 先说说我们为什么需要库? 当有些代码我们大量会在程序中使用比如(scanf,printf等)这些函数我们需要在程序中频繁使用,于是我们就把这些代码编译为库文件,在需要使用时我们直接链接即可. ...

  5. 安卓开发遇到Error:Execution failed for task ':app:transformClassesWithDexForDebug'.

    问题如下: Error:Execution failed for task ':app:transformClassesWithDexForDebug'. com.android.build.api. ...

  6. 20160223.CCPP体系详解(0033天)

    程序片段(01):MyArray.h+MyArray.c+main.c 内容概要:数组库 ///MyArray.h #pragma once #define DT int//类型通用 typedef ...

  7. Mac入门

    Mac入门 桌面 windows桌面有图标罗列 Mac桌面有Dock 菜单栏 感觉上和Windows系统的底部菜单栏有点像,但是却略有不同,Mac的菜单栏默认在顶部 左侧的一些功能是固定不变的,跟随当 ...

  8. Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01

        1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...

  9. linux 防火墙操作

    root/12345 (只能用ROOT操作)iptables -I INPUT -s x.x.x.x -p tcp --dport 8091 -j ACCEPT   #允许x.x.x.x访问本机的80 ...

  10. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...