观察者模式的定义
观察者模式简述
MVC是由各种复杂的设计模式组合而成的复合结构,观察者是其中的设计模式之一。视图与控制器联系在一起,等待会影响应用程序表现的事件发生。例如,当用户单击视图上的排序按钮时,事件会传递给控制器,模型在后台排序完毕后,会通知所有相关的控制器,让它们用新的数据更新视图。
在MVC中使用观察者模式,每个组件都能够被独立复用与扩展,而对关系中的其他组件没有太多干扰。所得到的高度可复用性与可扩展性,是把其全部逻辑放入一个类中所无法得到的。因此,向控制器添加额外的视图时,不用修改已有的设计和代码。同样,不同的控制器可以使用同一个模型,而不用对使用它们的其他控制器做修改。
什么时候使用观察者模式:
- 有两种抽象类型相互依赖,将他们封装在各自的对象中,就可以对它们单独进行改变和复用
- 对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
- 一个对象必须通知其他对象,而它又不知道其他对象是什么
Cocoa 的观察者模型
- NSNotificationCenter(消息中心)
- KVC&KVO
NSNotification更重量级一些,除了监听外,还需负责传递信息等。
KVC
基本概念
KVC = "Key-Value Coding"
key是一个字符串来标识对象的特定属性。通常,一个key对应一个访问器方法的名称或接收对象的实例变量。key必须使用ASCII编码,以小写字母开头,不包含空格。
key path : 是一个字符串键,用于指定一个对象属性的遍历序列。序列中的第一个键的性质是相对的接收者,并且每个后续key和前一个属性的值相对。
常用API形式:
valueForKey:
valueForKeyPath:
dictionaryWithValuesForKeys: //输入一组key,返回这组key的所有值;
setValue:forKey:
setValue:forKeyPath:
setValuesForKeysWithDictionary: //输入一个key-value的dictionary,调用setValue:forKey:进行一个一个的设置操作;
KVO
基本概念
KVO = "Key-Value Observing"
它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
使用方法
- 注册,指定被观察者的属性,
- 实现回调方法
- 移除观察
NSNotificationCenter
应用场景
- 窗口变化通知
- 系统键盘的出现和消失/位置大小变化
- UITextField 字符变化通知(可以用来限制输入长度)
- MPMoviePlayerController 播放器的行为变化
- 自定义 Class 使用