观察者模式

来源:互联网 发布:淘宝达人粉丝购买 编辑:程序博客网 时间:2024/06/05 11:14

1, KVC机制(Key-Value Coding,表示键值编码),由NSKeyValueCoding协议提供支持,该协议内提供了一些修改和获取属性的方法。
-使用KVC操作属性:
- (void)setValue:(id)value forKey:(NSString *) key;// 使用KVC对属性进行赋值
- (id)valueForKey:(NSString *) key;//使用KVC获取属性值
-使用KVC获取Key路径
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;//keyPath:如person.name
-处理不存在的Key,属性不存在时会自动调用下面的方法,会输出异常信息,想要得到确定的信息,需要重写两个方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
- (void)valueForUndefinedKey:(NSString *)key;
-字典转模型
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues; //用于字典转模型
- (NSDictionary )dictionaryWithValuesForKeys:(NSArray )keys; //用于模型转字典

KVC的底层执行机制:对于name属性,使用setValue:forKey:方法    a,优先考虑调用setName方法复制    b,无set方法时,搜索该类中名为_name的成员变量,然后赋值    c,无_name成员变量时,搜索该类中名为name的成员变量,然后赋值    d,都没有时,调用setValue:forUndefinedKey:方法valueForKey:方法同理。

2,KVO机制(Key-Value Observing,表示键值观察者),由NSKeyValueObserving协议提供支持,该协议包含以下常用方法。可用于注册监听器:
//注册一个监听器,用于建厅制定的key路径
- (void) addObserver:(NSObject )observer forKeyPath:(NSString )keyPath
options:(NSKeyValueObservingOptions)options context:(void *)context;
//为key路径删除一个指定的监听器,只是多了一个context参数
- (void) removeObserver:(NSObject )observer forKeyPath:(NSString )keyPath
context:(void *)context;
//为key路径删除一个指定的一个监听器
- (void) removeObserver:(NSObject )observer forKeyPath:(NSString )keyPath;
要使用KVO机制为Bank实例的一个accountBalance属性 建立一个观察员需要:
a,Bank实例必须注册一个监听器
[self.bank addObserver:forKeyPath:option:context]; //添加self.person为观察员时,设置addObserver:self.person
b,为了能够响应消息,观察员必须实现以下方法:
- (void)observeValueForkeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary )change context:(void )context; //Person类的.m文件中,需要写该方法
四个参数:
keyPath:代表监听的属性
object:表示监听的对象
change:属于字典类型,表示该属性修改前后的值
context: 表示注册监听时传递过来的值

KVO底层实现原理:        KVO机制由OC强大的runtime所支持。程序在运行过程中,系统会自动通过runtime给    被监听的对象创建一个子类名为“NSKVONotifying_类名称”,并重写该子类的set方法,    在set方法中跳用监听者的observeValueForKeyPath:ofObject:change:context:方法;

3,通知机制:
通知机制时苹果公司除委托代理之外的另一种通知响应的机制。与委托不同,委托是对象之间“一对一”的通信,而通知则是对象间 的“一对多”通信,它可以为两个无引用关系的对象通信,实现更大跨度的通信。
要发布通知,首先需要创建一个通知对象,通知是使用NSNotification类表示的,它就是一个通知内容的载体。
NSNotification类提供一些初始化通知对象的方法:
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;
- (instancetype)initWIthName:(NSString )name object:(id)object userInfo:(NSDictionary )userInfo;

    完成通知对象的初始化后,就需要实现通知机制,通知机制的实现分为3个部分:    a,通知发布者        通知发布者主要负责发布通知到通知中心。通知中心类提供了一些响应的方法,协助发布通知:            - (void)postNotification:(NSNotification *)notification;            - (void)postNotificationName:(NSString *)aName object:(id)anObject;            - (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictonary *)aUserInfo;    b,通知中心        通知中心用NSNotificationCenter 类表示,主要负责接受通知发布者的通知,并将该通知转发给通知接收者。获取一个    通知中心对象的方法:            + (NSNotificationCenter *)defaultCenter;//通知对象为一个单例模式。    c,通知接收者        通知接收者主要负责接收从通知中心发布的通知。要想实现通知的接收,必须要注册一个通知监听器,使用    NSNotificationCenter 类提供的方法来注册:            - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;            - (id<NSObject>)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue                                         usingBlock: (void (^) (NSNotification *note))block;        通知中心不会保留监听器对象,在通知中心注册过的对象,必须在对象释放前取消注册,否则响应的通知再次出现时,通知中心仍会给监听器发送消息,这时对象已经被释放了,会导致程序崩溃。为此,NSNotificationCenter类还提供了注销监听器的方法,具体的定义格式如下:            - (void)removeObserver:(id)observer;            - (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject; 
0 0