设计模式–观察者模式
设计模式 : 解决某一特定问题
观察者模式 : 假如有个A类,然后在一些类中要去观察A类发生的变化时,这些类就会收到信息,做出相应的反应.
什么时候用到观察者模式?
当一个类需要发送多个消息给多个类的时候,就用观察者模式
观察者的作用?
一对多的消息发送
在OC中如何实现观察者模式?
OC中观察者模式的设计基础 : KVC KVO
KVC(键值编码 Key-Value-Coding)
现创建一个学生类
一般要对属性进行赋值和访问时可运
1.改变实例变量的作用域 @public
2.运用setter和getter语法
这些都是直接进行访问
还有一种情况,属于间接访问 就是KVC(setValue: forKey:)
为什么要用KVC访问属性???
使用KVC的能节省代码,而且可扩展性更强,更灵活
如:
这种代码如果再继续增加属性,就需反复增加else if.
运用KVC
当我们要访问一个A类的属性时,A中的属性是B类中的属性,这时候就可以用KVC(setValue: forKeyPath:)
如:创建一个Book类有一个bookName属性,导入到学生类中,通过访问学生类来访问bookName
KVO 观察键值对修改
KVO的由来
在编译的过程中,我们经常需要判断目标是否发生变化,以便及时做出对应的处理.此时苹果公司就提供一种策略,即OC运行时提供KVO. (KVO是基于KVC实现)
KVO的实现:
1.注册成为观察者
2.观察者定义KVO回调
3.移除观察者
创建一个Hero类
#import <Foundation/Foundation.h>
@interface Hero : NSObject
{
NSInteger _hp;
}
@end
再创建一个观察者Observe类 导入Hero类
#import <Foundation/Foundation.h>
#import "Hero.h"
@interface Observer : NSObject
@property(nonatomic,strong)Hero *hero;
-(id)initWithHero:(Hero *)hero;
@end
在Observe类的.m文件中
第一个参数: 常设为self,接收通知的对象,即观察者
第二个参数: 键路径参数,要观察的键路径
第三个参数: 标识KVO 希望变化如何传递给观察者 ,这些值可以使用”|”进行多选.
其中change是个字典 ,change[]和[change…]都是一样的
运行的结果会显示出_hp
现在加个计时器
注意_hero=hero和_observe=observe这步操作,不进行这步的话observe将会在中途被移除
下图是将变量改为全局变量
这里首先要将hero和observe改为全局变量
其中这里没有加计时器的环境是因为系统自带了!!!
(KVO有点懵>.<加计时器 更加懵~~~~>.<)