您的位置:首页 > 产品设计 > UI/UE

iOS疯狂讲解之KVO键值观察者(key- values-observer)

2015-09-16 20:53 399 查看
kvo键值观察者是观察者设计模式的一种具体实现

KVO是 通过 观察 对象中的某个属性的变化 从而触发某个方法

这个方法就是

控制器(C)作为观察者 观察数据模型(M)的变化从而修改视图(V)的变化

观察model中的属性 发生变化后 让图片显示到cell上 异步加载图片

思路:

1,先明确 观察者(C) 和 被观察者(和cell对应model中的一个属性 并且是一个可以改变的 图片从无到有)

2, 如何让图片从无到有?

肯定是从网址请求的 , 如何请求? 用咱封装好的 ImageDownder类 去请求

3,咱们可以给model写一个方法去请求图片(方法中是用ImageDownloader对象)

4,这个model的请求方法怎么写? 可以让图片加载出来

5, 从无到有之后 触发观察者方法

6, 方法中 把model中的图片放到对应的cell上

7,最后一步移除观察者

KVO触发机制:一个对象(观察者),监测另一对象(被观察者)的某属性是否发生变化,若被监测的属性发生的更改,会触发观察者的一个方法(方法名固定,类似代理方法)

KVO使用步骤:

1,注册观察者(为被观察者指定观察者以及被观察属性)

2,实现回调方法

3,触发回调发方法(被观察属性发生更改)

4,移除观察者

什么情况下用KVO?

(1),通常适用于根据A类(数据类)的某个属性值变化,B(view类)中的某个属性(控件状态)做出相应变化,体现了MVC的思想

(2)比如用于用户界面交互,当多个view共同使用了同一个实体(数据类),当这个实体中的某个属性改变时,如果需要更新多个界面,KVO就能发挥作用了

比如:创建一个sicongt类,使用KVO模式,给其中的hobby属性添加监听者(观察者) 监听的是对象的某个属性
这里写代码片


import “SiCong.h”

@implementation SiCong

- (void)dealloc

{

[_hobby release];

[super dealloc];

}

@end

“`

import “RootViewController.h”

import “SiCong.h”

@interface RootViewController ()

// 声明属性 方便修改

@property (nonatomic, retain) SiCong *yongfei;

@end

@implementation RootViewController

/**

* KVO 键值观察者

KVO是 通过 观察 对象中的某个属性的变化 从而触发某个方法

控制器(C)作为观察者 观察数据模型(M)的变化 从而修改视图(V)的变化

*/

/**

* 观察model中的属性 发生变化后 让图片显示到cell上 异步加载图片

思路:

1, 先明确 观察者(C) 和 被观察者(和cell对应model中的一个属性 并且是一个可以改变的 图片从无到有(就是哪一个属性是可以变化的))

2, 如何让图片从无到有?

肯定是请求的 如何请求? 用咱封装好的 ImageDownder类 去请求

3, 咱们可以给model写一个方法去请求图片 (方法中是用ImageDownloader对象)

4, 这个model的请求方法怎么写? 可以让图片加载出来

5, 从无到有之后 触发观察者方法

6, 方法中 把model中的图片放到对应的cell上

7, 最后一步移除观察者

*/

(void)viewDidLoad {

[super viewDidLoad];

// 构建一个思聪

self.yongfei = [[SiCong alloc] init];

_yongfei.hobby = @”年少钱多无所事事”;

// 观察一下永飞的兴趣属性

// addObserver 添加一个观察者

// forKeyPath 被观察者的某个属性

// options 观察的变化(新的 老的) 添加连个枚举值中间用 “|” 分开

// context 可以是携带的参数 也可以是空的(nil)

// 观察者 self 代表 控制器(C)

// 被观察者 @”hobby” 代表 model对象(M)的属性

[_yongfei addObserver:self forKeyPath:@”hobby” options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:@”不知道”];

// 添加一个button让属性遍

UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];

button.frame = CGRectMake(100, 100, 200, 100);

button.backgroundColor = [UIColor purpleColor];

[button addTarget:self action:@selector(actionButton:) forControlEvents:(UIControlEventTouchUpInside)];

[button setTitle:@”改变属性” forState:(UIControlStateNormal)];

[self.view addSubview:button];

}

// 如果观察的某个属性发生了变化就出发该方法

- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void *)context

{

// 被观察的属性

NSLog(@”keyPath= %@”, keyPath);

// 被观察属性的对象

NSLog(@”object = %@”, object);

// 更改的新值 和 旧值 组成的字典

NSLog(@” change = %@, %@, %@, 类型%@”, change[@”new”],change[@”kind”], change[@”old”],[change class]);

// 携带的参数

NSLog(@” context =%@”, context);

// 更改背景颜色

self.view.backgroundColor = [UIColor greenColor];

// 取消观察者 思考:

[object removeObserver:self forKeyPath:@”hobby”];

}

// 实现button的方法

- (void)actionButton:(UIButton *)button

{

self.yongfei.hobby = @”新的”;

}

“#import
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: