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

1 篇文章 0 订阅
1 篇文章 0 订阅
  1. kvo键值观察者是观察者设计模式的一种具体实现
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值