观察者模式(kvc、kvo、通知)
2016-08-03 16:15
399 查看
KVC
KVC: key values coding 键值编码,间接通过字符串对应的key取出、修改其对应的属性。
作用: 可以访问和修改私有成员变量、readOnly成员变量的值。(替换系统自带的导航栏、替换系统自带的Tabbar等)
示例代码:
这仅仅只是一个示例,KVC当然是强大的,UIKit框架里面很多属性是readOnly、私有的,往往我们在开发中会觉得有一些属性不好用,想改变吧,要么是readOnly,要是是私有的,难道重新写一套?但是耗时耗力,项目需要赶进度的话,就得加班。这个时候,KVC的作用就大了,我们可以自定义那些特定需求的控件,然后用KVC将系统自带的换掉,换成自定义的,简单快速轻松就可以搞定了。当然,要是系统没有对应属性的控件,就只能自定义了。
2. KVO
KVO是用来做属性监听的,用完后必须要移除它。
其实现原理:KVO是基于runtime机制实现的,当某个类的对象第一次被观察时,系统就会在运行期动态的创建一个该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法,派生类在重写基类的setter方法中实现真正的通知机制。
如此,来看看代码里面KVO怎么实现监听一个对象值的改变:
viewController里面的代码:
上述,就是一个KVO的完整实现,但事实上,还是有瑕疵的,潜在的问题有可能出现在dealloc中对KVO的注销上。KVO的一种缺陷(其实不能称为缺陷,应该称为特性)是,当对同一个keypath进行两次removeObserver时会导致程序crash,这种情况常常出现在父类有一个kvo,父类在dealloc中remove了一次,子类又remove了一次的情况下。
3. NSNotification
一个类的属性发生改变,我们也可以使用NSNotification告诉其他对象,被改变的具体情况。
先上代码:
viewController里面的代码:
这样,也是可以监听到对象属性的改变的,甚至,我们在用delegate来监控一些状态的改变也是可以做到的,这些都可以说是OC中的监听者模式。
只是说,需要注意,如果是跨控制器之间的监听、或者传递信息,建议用NSNotification更好,如果是view与它的ViewController之间的监听,用委托(也就是delegate)更好。
4. 观察者模式
KVO、NSNotification、委托都可以说是OC里面的监听者模式,NSNotification更重量级一些,除了监听外,还需负责传递信息等。
什么时候使用观察者模式:
有两种抽象类型相互依赖,将他们封装在各自的对象中,就可以对它们单独进行改变和复用。
对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
一个对象必须通知其他对象,而它又不知道其他对象是什么。
MVC是由各种复杂的设计模式组合而成的复合结构,观察者是其中的设计模式之一。视图与控制器联系在一起,等待会影响应用程序表现的事件发生。例如,当用户单击视图上的排序按钮时,事件会传递给控制器,模型在后台排序完毕后,会通知所有相关的控制器,让它们用新的数据更新视图。
在MVC中使用观察者模式,每个组件都能够被独立复用与扩展,而对关系中的其他组件没有太多干扰。所得到的高度可复用性与可扩展性,是把其全部逻辑放入一个类中所无法得到的。因此,向控制器添加额外的视图时,不用修改已有的设计和代码。同样,不同的控制器可以使用同一个模型,而不用对使用它们的其他控制器做修改。
KVC: key values coding 键值编码,间接通过字符串对应的key取出、修改其对应的属性。
作用: 可以访问和修改私有成员变量、readOnly成员变量的值。(替换系统自带的导航栏、替换系统自带的Tabbar等)
示例代码:
2. KVO
KVO是用来做属性监听的,用完后必须要移除它。
其实现原理:KVO是基于runtime机制实现的,当某个类的对象第一次被观察时,系统就会在运行期动态的创建一个该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法,派生类在重写基类的setter方法中实现真正的通知机制。
如此,来看看代码里面KVO怎么实现监听一个对象值的改变:
3. NSNotification
一个类的属性发生改变,我们也可以使用NSNotification告诉其他对象,被改变的具体情况。
先上代码:
只是说,需要注意,如果是跨控制器之间的监听、或者传递信息,建议用NSNotification更好,如果是view与它的ViewController之间的监听,用委托(也就是delegate)更好。
4. 观察者模式
KVO、NSNotification、委托都可以说是OC里面的监听者模式,NSNotification更重量级一些,除了监听外,还需负责传递信息等。
什么时候使用观察者模式:
有两种抽象类型相互依赖,将他们封装在各自的对象中,就可以对它们单独进行改变和复用。
对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
一个对象必须通知其他对象,而它又不知道其他对象是什么。
MVC是由各种复杂的设计模式组合而成的复合结构,观察者是其中的设计模式之一。视图与控制器联系在一起,等待会影响应用程序表现的事件发生。例如,当用户单击视图上的排序按钮时,事件会传递给控制器,模型在后台排序完毕后,会通知所有相关的控制器,让它们用新的数据更新视图。
在MVC中使用观察者模式,每个组件都能够被独立复用与扩展,而对关系中的其他组件没有太多干扰。所得到的高度可复用性与可扩展性,是把其全部逻辑放入一个类中所无法得到的。因此,向控制器添加额外的视图时,不用修改已有的设计和代码。同样,不同的控制器可以使用同一个模型,而不用对使用它们的其他控制器做修改。
相关文章推荐
- NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)
- 观察者模式 - 通知/KVO
- OC 之 KVO、KVC、通知(笔记)
- KVC,KVO,通知
- KVC,KVO,通知
- kvc、kvo、通知
- iOS 代理与通知,kvc和kvo的区别
- OC 观察者模式(通知中心,KVO)
- kvc、kvo、通知
- iOS开发笔记6--KVC,KVO,通知
- KVC、KVO、通知
- Objective-c KVC and KVO and 通知
- oc中KVC,KVO,通知的使用
- iOS中 KVC\KVO和通知三者之间的小结
- 12.代理、通知、KVC\KVO
- 移动开发(IOS) – Objective-C-10-KVC、谓词、KVO与通知
- iOS 观察者模式(KVC&KVO、通知)
- OC学习总结之KVC KVO 通知
- iOS学习笔记-----KVC,KVO与通知初探
- KVC键值码,KVO键值观察,通知NSNotification