iOS语法之KVO的使用

简介:

KVO:Key Value Observing,顾名思义,键值观察。
KVO主要用于视图交互方面,比如界面的某些数据变化了,界面的现实也跟着需要变化,那就要简历数据和页面的关联。
下面通过实例讲解KVO的简单使用。

KVO自动调用简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
// Student.h
// testOC
//
// Created by Benjamin on 1/4/16.
// Copyright © 2016 Benjamin. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject {

NSString *_name;
NSString *_courseName;
int _age;
}

- (void)changeCourseName:(NSString *) newCourseName;
- (void)changeAge:(int) age;
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
// Student.m
// testOC
//
// Created by Benjamin on 1/4/16.
// Copyright © 2016 Benjamin. All rights reserved.
//

#import "Student.h"

@implementation Student

-(void)changeCourseName:(NSString *)newCourseName {
_courseName = newCourseName;
}

- (void)changeAge:(int)age {
_age = age;
}


@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//
// PageView.m
// testOC
//
// Created by Benjamin on 1/4/16.
// Copyright © 2016 Benjamin. All rights reserved.
//

#import "PageView.h"
#import "Student.h"

@implementation PageView

-(id)init:(Student *)initStudent {
if (self == [super init]) {
student = initStudent;
// options确定返回的字典包含什么值:NSKeyValueObservingOptionNew包含新值
// NSKeyValueObservingOptionNew包含旧值
// keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
[student addObserver:self forKeyPath:@"courseName" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}
return self;
}

-(void)dealloc {
[student removeObserver:self forKeyPath:@"courseName" context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqual:@"courseName"]) {
NSLog(@"PageView课程被改变了");
NSLog(@"PageView新课程是: %@, 老课程是: %@", [change objectForKey: @"new"], [change objectForKey: @"old"]);
}
}

@end

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)useKVO {
Student *student = [[Student alloc] init];
[student changeCourseName:@"语文课"];
[student changeAge:19];
NSLog(@"初始值: %@ %@", [student valueForKey: @"courseName"], [student valueForKey: @"age"]);

PageView *page = [[PageView alloc]init:student];
[student setValue:@"数学课" forKey:@"courseName"];
[student changeCourseName:@"英语课"]; //这样直接改变不会触发observer,说明只有通过键值编码(KVC)改变的值,才会回调观察者注册的方法。

[student willChangeValueForKey:@"age"];
[student changeAge:20];
[student didChangeValueForKey:@"age"];

/**
输出结果:
2016-01-04 14:47:36.794 testOC[31517:1071934] 初始值: 语文课
2016-01-04 14:47:36.795 testOC[31517:1071934] PageView课程被改变了
2016-01-04 14:47:36.795 testOC[31517:1071934] PageView新课程是: 英语课, 老课程是: 语文课
**/

}

输出结果:

1
2
3
2016-01-05 17:59:15.642 testOC[42635:1792662] 初始值: 语文课 19
2016-01-05 17:59:15.643 testOC[42635:1792662] PageView课程被改变了
2016-01-05 17:59:15.643 testOC[42635:1792662] PageView新课程是: 数学课, 老课程是: 语文课

可以看到,只有通过KVC方式赋值才会触发Observer。
不懂KVC的童鞋,请看这篇文章: KVC
不懂观察者模式的童鞋可以看看这篇文章:Observer

参考:http://www.cnblogs.com/stoic/archive/2012/07/24/2606784.html

目录
相关文章
|
缓存 JavaScript iOS开发
iOS 逆向编程(十四)Cycript 语法入门
iOS 逆向编程(十四)Cycript 语法入门
202 0
|
缓存 JavaScript iOS开发
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
197 0
|
安全 iOS开发
iOS开发 - 字面语法之数组注意事项
iOS开发 - 字面语法之数组注意事项
87 0
|
存储 安全 Swift
iOS - 巧用字面量语法
iOS - 巧用字面量语法
107 0
|
存储 iOS开发
iOS Principle:KVO(下)
iOS Principle:KVO(下)
145 0
iOS Principle:KVO(下)
|
存储 C语言 iOS开发
iOS Principle:KVO(上)
iOS Principle:KVO(上)
150 0
iOS Principle:KVO(上)
|
Android开发 iOS开发
iOS开发:KVC与KVO
KVC 就是键值编码(key-value-coding),可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。 KVO 是键值观察者(key-value-observing)。实现方式:通过对某个对象的某个属性添加观察者,当该属性改变,就会调用”observeValueForKeyPath:”方法,为我们提供一个“对象值改变了!”的时机进行一些操作。
250 0
iOS开发:KVC与KVO
|
编译器 iOS开发
iOS-底层原理 23:KVO 底层原理
iOS-底层原理 23:KVO 底层原理
220 0
iOS-底层原理 23:KVO 底层原理
|
安全 iOS开发
iOS探索 -- KVO 的原理分析
KVO (key-value-observing) 是一种 键值观察 机制, 它允许当前对象去观察目标对象的某个属性的变化; 当被观察对象的属性发生变化后, 会通过特定方法通知观察者对象属性变化的一些情况内容, 观察者对象拿到变化情况后做出相关操作。
195 0
|
监控 iOS开发
IOS开发-KVO
观察者,观察对象属性的变化,当被观察者该属性发生变化时,观察者会接收到通知,可以在回调函数中做相应的处理