观察者模式之通知机制与KVO机制
来源:互联网 发布:java验证码代码怎么写 编辑:程序博客网 时间:2024/05/16 05:29
观察者模式也叫发布/订阅模式,顾名思义,主要由一个观察者(observe)和一个订阅者(subscribe)组成。
- observe用于检查状态,发出通知。
- subscribe用于接受observe发出的通知,然后响应。
- 最常见于应用在MVC模式中。
例如:作战时,哨兵(observe)会在营地上巡逻放哨,此时我方战士(subscribe)在休息,一旦哨兵发现有敌军入侵,则发送通知(notifiction),我方战士接受到notification则马上停止休息,进入作战准备状态。
在cocoa touch框架中,观察者模式的具体应用有两个----广播通知和KVO机制。
- 广播通知:
常用的类:NSNotificationCenter
常用的方法:defaultCenter ( 获取通知中心 )
addObserver : selector : name : object ( 消息注册 )
removeObserver : name:object :(解除注册消息)
postNotification : postNotificationName : object : userInfo : ( 发送通知 )
代码:
#pragma 广播通知- (IBAction)observeBtn:(id)sender {// 注册通知,广播通知会将通知YANRegisterNotification与动作regisiterAction联系起来,当发出YANRegisterNotification时则响应regisiterAction [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(regisiterAction:) name:@"YANRegisiterNotification" object:nil] ;}-(void)regisiterAction:(NSNotification *)notification{ NSDictionary *data = [notification userInfo] ;\ NSString *result = [data objectForKey:@"username"] ; self.textField.text = result ;}- (IBAction)notificationAction:(id)sender { // 发送YANReigisterNotification通知,并且传递data数据 NSDictionary *data = [NSDictionary dictionaryWithObject:self.sendNotification.text forKey:@"username"] ; [[NSNotificationCenter defaultCenter]postNotificationName:@"YANRegisiterNotification" object:nil userInfo:data] ;}
- KVO机制:KVO其实就是一个协议<NSKeyValueObserving>,而且NSObject已经实现该协议。所以我们可以在代码上直接实现其方法就可以
常用到的方法:
//开始观察对象
addObserver:(NSObject *)监听的对象 forKeyPath:(NSString *)状态属性 options:(NSKeyValueObservingOptions) context:(void *)
//状态改变时响应动作
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
代码:
# pragma KVO机制/** * 观察者开始观察对象textfield,观察的状态是states。 */- (IBAction)startKVO:(id)sender { self.states = @"yans67" ; [ self addObserver:self forKeyPath:@"states" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"context"];//监听的对象是当前对象,所以用self}-(void)textFieldDidBeginEditing:(UITextField *)textField{ self.states = @"begin edit" ;}-(void)textFieldDidEndEditing:(UITextField *)textField{ self.states = @"end edit" ;}-(BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField endEditing:YES] ; self.states = @"return edit" ; return true ;}/** * 状态改变时响应的动作 */-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSString *result = (NSString *)change[NSKeyValueChangeNewKey] ; self.KVOresultlabel.text = result ;}
总结: 无论是KVO机制还是广播通知机制,都降低了代码间的耦合度(从本例子中很难看出来,为了方便本例都是些在同一个类里面,但如果写在两个不同的类就能很明显的体现出来)而且能实现参数的传递,实现类与类之间方法的调用。
0 0
- 观察者模式之通知机制与KVO机制
- 观察者模式 - 通知/KVO
- Cocos中的观察者设计模式与通知机制
- KVO和通知机制
- 通知机制和KVO机制
- 谈KVC、KVO(重点观察者模式)机制编程
- 谈KVC、KVO(重点观察者模式)机制编程
- iOS 观察者模式(KVC&KVO、通知)
- iOS 中的观察者模式, KVO, 通知
- 观察者模式(kvc、kvo、通知)
- ios之KVO机制
- 事件响应机制与观察者模式
- 观察者模式与事件监听机制
- 模式 - 通知机制
- 关于iphone开发中观察者模式中的kvo机制的总结
- KVO 设计模式之观察者模式
- iOS开发之KVO机制
- 8观察者模式( kvo基于键值 和Notification通知)
- php学习笔记
- 【iOS开发】企业版证书($299)In-House方式发布指南
- [DLX重复覆盖] hdu 2828 Lamp
- Java 通过JDBC连接Mysql数据库的方法和实例(改动版)
- 【UIKit】-5,6,7-UIActivity - 系统服务,社交信息等
- 观察者模式之通知机制与KVO机制
- hd-1094:A+B for Input-Output Practice (VI)
- CNN模型
- easy-ui
- The supeority of film faced plywood
- HP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
- 向量的点乘与叉乘
- 指示器滚动
- Oracle 中 decode 函数用法