KVO   http://blog.kyleduo.com/2014/10/20/ios_learning-kvo/

定义:

KVO:Key-Value Observing,是Foundation框架提供的一种机制,使用KVO,可以让       观察者(Observing)        方便地对指定对象(Object)   的   指定属性(Key)    进行观察,当属性发生变化       <如值(Value)变化时>    时,观察者  会被通知。

使用:KVO只需要两个步骤: 1.注册Observer; 2.接收通知

a 注册Observer

- (void)addObserver:(NSObject *)observer

forKeyPath:(NSString *)keyPath

options:(NSKeyValueObservingOptions)options

context:(nullable void *)context;

参数含义 :

observer :观察者,需要响应属性变化的对象。该对象必须实现(接收通知的方法)

keyPath :要观察的属性名称,要和属性声明的名称一致。注意:是字符串类型

options :对 KVO机制进行配置,修改KVO通知的时机以及通知的内容。

context :接收一个 C 指针 ,指向希望监听的属性。如 : &self->_testData

注: 使用   需要被监听对象(Object)     来调用这个方法(注册)

b 接收通知

- (void)observeValueForKeyPath:(nullable NSString *)keyPath

ofObject:(nullable id)object

change:(nullable NSDictionary<NSString*, id> *)change

context:(nullable void *)context;

参数含义 :

object:这个是所监听的对象,也就是所监听的属性所属的对象。

change:是传入的变化量,根据在注册时用 options 参数 进行配置,参数不同,会包含不同的内容。

其他参数同注册方法一样。

注意:在实现这个方法时, 一定要对注册监听的所有属性都进行处理——使用context参数进行判断——否则Xcode会警告。

c 注意: 注册Observer之后一定要在合适的机会解除注册,否则会引发资源泄露,取消注册的方法

- (void)removeObserver:(NSObject *)observer

forKeyPath:(NSString *)keyPath

context:(nullable void *)context NS_AVAILABLE(10_7, 5_0);

options 参数

typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {

NSKeyValueObservingOptionNew = 0x01,

NSKeyValueObservingOptionOld = 0x02,

NSKeyValueObservingOptionInitial NS_ENUM_AVAILABLE(10_5, 2_0) = 0x04,

NSKeyValueObservingOptionPrior NS_ENUM_AVAILABLE(10_5, 2_0) = 0x08

};

值含义:

NSKeyValueObservingOptionNew 接收方法中使用change参数传入变化后的新值,键为:NSKeyValueChangeNewKey;

NSKeyValueObservingOptionOld 接收方法中使用change参数传入变化前的旧值,键为:NSKeyValueChangeOldKey;

NSKeyValueObservingOptionInitial 注册之后立刻调用接收方法,如果配置了NSKeyValueObservingOptionNew,change参数内容会包含新值,键为:NSKeyValueChangeNewKey;

NSKeyValueObservingOptionPrior 如果加入这个参数,接收方法会在变化前后分别调用一次,共两次,变化前的通知change参数包含notificationIsPrior = 1。其他内容根据NSKeyValueObservingOptionNew和NSKeyValueObservingOptionOld的配置确定。

change 参数

typedef NS_ENUM(NSUInteger, NSKeyValueChange) {     NSKeyValueChangeSetting = 1,     NSKeyValueChangeInsertion = 2,     NSKeyValueChangeRemoval = 3,     NSKeyValueChangeReplacement = 4,

};

值含义:

NSKeyValueChangeSetting 属性的值被重新设置;

NSKeyValueChangeInsertion

NSKeyValueChangeRemoval

NSKeyValueChangeReplacement 表示更改的是集合属性,分别代表插入、删除、替换操作。

如果NSKeyValueChangeKindKey参数是针对集合属性的三个之一,change参数还会包含一个NSKeyValueChangeIndexesKey键值对,表示变化的index。

自动通知和手动通知

上文提到,KVO默认会自动通知观察者。取消自动通知的方法是实现

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key;

方法,通过返回NO来控制取消自动通知。

针对非自动通知的属性,可以分别在变化之前和之后手动调用如下方法(will在前,did在后)来手动通知观察者: (will/did)ChangeValueForKey: (will/did)ChangeValueForKey:withSetMutation:usingObjects: (will/did)Change:valuesAtIndexes:forKey:

因为大多情况下都使用自动通知,这里就不过多解释。事实上自动通知也是框架通过调用这些方法实现的。

iOS 常用设计模式和机制之KVO的更多相关文章

  1. iOS常用设计模式和机制之代理

    Delegate : 1 代理设计模式的使用我们首先需要明白三个要素 *委托方:委托别人去执行某些操作的人(对象) *代理方:被委托区执行某些操作的人(对象) *协议:(protocol)委托方需要代 ...

  2. iOS 常用设计模式和机制之 KVC

    KVC 1  key Value Coding,键值编码,是一种间接访问实例变量的方法 2  KVC 提供了一种使用字符串(key)而不是访问器方法,去访问一个对象实例变量的机制 3  KVC 常用方 ...

  3. iOS常用设计模式和机制之Block简单使用

    Block :block 实际上就是 Objective-C语言对闭包的实现 闭包(Closure):闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量.闭包允许一个函数访问声明该 ...

  4. iOS常用设计模式:MVC、单例、代理、观察者。

    MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...

  5. IOS常用设计模式之委托模式

    对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模 ...

  6. iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...

  7. iOS常用设计模式笔记

    一.原则 1.单一职责原则 (Single Responsiblity Principle SRP) 2.开闭原则(Open Closed Principle,OCP) 3.里氏替换原则(Liskov ...

  8. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  9. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

随机推荐

  1. Sprint(第五天11.18)

  2. Java 中的 static 使用之静态初始化块

    Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...

  3. ios下移除原生样式

    之前遇到过这个问题,今天无意中在网上看见博文 记录一下. 设置这个就好: -webkit-appearance : none ;

  4. mac 安装 nginx 环境

    1.brew search nginx 2.brew install nginx 启动nginx ,sudo nginx ;访问localhost:8080 发现已出现nginx的欢迎页面了. 备注: ...

  5. Criterion & DetachedCriteria

    今天笔记主要是记录笔记,以及代码: criteria: 创建查询接口:createCriteria(class) 查询条件接口:add(各种条件); Restrictions 提供了设置参数的各种接口 ...

  6. poj2778DNA Sequence(AC自动机+矩阵乘法)

    链接 看此题前先看一下matrix67大神写的关于十个矩阵的题目中的一个,如下: 经典题目8 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值    把给定的图转为邻 ...

  7. Python 日期格式转换

    经常需要爬取网站上的时间信息,不同的网站又有不同的日期显示方式.而我需要将日期格式转化为一种特定的格式,所以为了简便和学习,记录下各种不同的日期格式转换. 日期格式化符号: %y :两位数的年份表示( ...

  8. Git基础操作

    配置秘钥 1.检查本机有没有秘钥 检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件. $ ~/.sshbash: /c/Users/lenovo/.ssh: Is a ...

  9. 模拟系列(一)——数字电路

    要求 简要模拟数字电路的运行过程,及电位(简化为L和H),用C# WinForm实现. 思路 逻辑部分 电路是一种图结构,基于C#的特性,设计Node类(结点)和Wire类(连线),且为泛型. 由于电 ...

  10. HTML 标题<h1>-<h6>

    定义和用法 <h1> - <h6> 标签可定义标题.<h1> 定义最大的标题.<h6> 定义最小的标题. 由于 h 元素拥有确切的语义,因此请您慎重地选 ...