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

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    iOS各个证书生成细节
  • 7
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 8
    iOS:应用程序的线程安全性
  • 9
    iOS开发-UIScrollView原理
  • 10
    iOS - Swift NSPoint 位置
  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    9
  • 2
    iOS各个证书生成细节
    21
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    113
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 7
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    39
  • 8
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    152
  • 9
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    299
  • 10
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    104