iOS 开发笔记-Objective-C之KVC、KVO
概述
键值编码(KVC)、键值监听(KVO)特性
键值监听KVO
Key Value Observing(简称KVO)其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身。在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO。
在ObjC中使用KVO操作常用的方法如下:
- 注册指定Key路径的监听器: addObserver: forKeyPath: options: context:
- 删除指定Key路径的监听器: removeObserver: forKeyPath、removeObserver: forKeyPath: context:
- 回调监听: observeValueForKeyPath: ofObject: change: context:
KVO的使用步骤也比较简单:
- 通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器
- 重写监听器的observeValueForKeyPath: ofObject: change: context:方法
- 删除指定Key路径的监听器: removeObserver: forKeyPath、removeObserver: forKeyPath: context:
例子:
1.我们新建一个账号模型
Account.h
#import <Foundation/Foundation.h> @interface Account : NSObject /** 余额 */
@property (nonatomic, assign) float balance; @end
2.在新建一个用户模型
Person.h
#import <Foundation/Foundation.h>
@class Account; @interface Person : NSObject /** 名字 */
@property (nonatomic, copy) NSString *name;
/** 账号 */
@property (nonatomic, retain) Account *account; @end
3.在Person.m Model里使用
// #import "Person.h"
#import "Account.h" @implementation Person - (void)setAccount:(Account *)account
{
_account = account;
[self.account addObserver:self forKeyPath:@"balance" options:NSKeyValueObservingOptionNew context:nil];
} - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"balance"]) {
NSLog(@"keyPath=%@,object=%@,newValue=%.2f,context=%@",keyPath,object,[[change objectForKey:@"new"] floatValue],context);
}
} - (void)dealloc{
[self.account removeObserver:self forKeyPath:@"balance"];// 移除监听
} @end
ViewController 就很简单了
- (void)viewDidLoad {
[super viewDidLoad]; Person *person = [[Person alloc] init];
person.name = @"jiangys";
_account = [[Account alloc] init];
person.account = _account; _account.balance = ; // 监听生效
}
但是这种方式,是不能更新到界面的。可能使用到这种场景,比如 暂停,快进这些,不需要界面变化的好一些。如果需要界面变化,如账号余额的变化等,那就需要放在Controller里面去做UI的更新了。
//
// ViewController.m
// KVO
//
// Created by jiangys on 16/4/19.
// Copyright © 2016年 Jiangys. All rights reserved.
// #import "ViewController.h"
#import "Person.h"
#import "Account.h" @interface ViewController ()
/** 账号 */
@property (nonatomic, retain) Account *account;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; Person *person = [[Person alloc] init];
person.name = @"jiangys";
_account = [[Account alloc] init];
person.account = _account;
// 增加KVO监听
[_account addObserver:self forKeyPath:@"balance" options:NSKeyValueObservingOptionNew context:nil]; _account.balance = ; _account.balance = ;
} - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"balance"]) {
NSLog(@"keyPath=%@,object=%@,newValue=%.2f,context=%@",keyPath,object,[[change objectForKey:@"new"] floatValue],context);
}
} - (void)dealloc{
[_account removeObserver:self forKeyPath:@"balance"];// 移除监听
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
KVO源代码下载:http://pan.baidu.com/s/1qYh7y8W
iOS 开发笔记-Objective-C之KVC、KVO的更多相关文章
- IOS开发-OC学习-kvc,kvo
kvc是用来方便的设置实例的属性值的,比如person类的实例p1有一个name的属性,那么我们可以通过kvc去设置p1的name,语法是: [ 对象 setValue:@"xiaming& ...
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- 菜鸟手下的iOS开发笔记(swift)
在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- 【Swift】iOS开发笔记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)
iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...
随机推荐
- linux:基本指令touch, cp 和 mv
touch 新建 #touch 的使用很简单, 我们先去往 Documents 的文件夹, 里面已经有了 folder1 和 file1, 如果我们想新建一个 file2 使用下面的语句就好. 一个空 ...
- XDCTF网络安全大赛——Web100
打开网址 http://game1.xdctf.com:8083/f16c3b1ed800fc78e605/index.php 网页中显示了一张图片,图片名为hackkey.png: 还有一段文字: ...
- 2012年蓝桥杯省赛A组c++第3题(喝断片的海盗)
/* 有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒, 所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的, 再次重复...... 直到开了第4瓶酒,坐着的已经所剩无 ...
- [bigdata] palantir
Palantir的无缝数据融合技术关键在于本体数据模型的灵活性,动态性,而且要能反映人.事.物和环境的关联关系及因果联系,这是大数据技术面临的核心挑战.
- Java之旅_高级教程_实例_文件操作
1.文件写入 import java.io.*; public class MainClass{ public static void main(String[] args){ try{ Buffer ...
- mysql插入一条记录时有自增id怎么办
①可以把id的值设置为null或者0,这样子mysql都会自己做处理 ②手动指定需要插入的列,不插入这一个字段的数据!
- Http-server 的使用
Http-server 是一款基于node.js的web前端开发服务,可以很好的承担前后端解耦后,前端服务的搭建. 1,首先安装node node下载地址:https://nodejs.org/zh- ...
- python之文件操作的几种模式总结
文件操作的几种模式: "w" #write ,清空写,生成一个新的文件,写入内容,覆盖原文件"w+" ...
- 重写toString()
重写Object的toString()之前,得到的结果是 类型 @ 内存地址 demo: package cn.sasa.demo1; public class Test { public stat ...
- codechef Sum of Cubes 图论
正解:图论+数学 解题报告: 先放个传送门QwQ 然后放下题目大意?就说给定简单图,无自环或重边,然后求(∑e[i][j])k,i,j∈S,S为点集的子集 然后因为k的取值只有[1,3],所以这里分类 ...