观察者模式
来源:互联网 发布:淘宝达人粉丝购买 编辑:程序博客网 时间: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;
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- lavarel框架增删改查
- xcode快捷键
- Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- 7.10 Git 工具 - 使用 Git 调试
- 块级元素和内联元素(行内元素)
- 观察者模式
- Android开发之——assets目录下资源使用总结
- canny边缘检测
- ShaderLab基础(SubShader)
- 如何在windows服务器上面创建定时任务
- input 内容改变——change事件
- js入门篇之正则表达式基础
- Spring4 Spring MVC实战(四)——Spring MVC实现类struts通配符跳转,HMTL、Ajax和EasyUI的交互,405及406错误
- 将jsp内容导出为Excel表简单实例