ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解

KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是另外一个对象,那么发现KVC用起来还是非常顺手,KVO(key-value observing)是键值对的观察者模式,如果对象的属性发生变更,那么会触发observeValueForKeyPath事件,KVO的这种通知特性让我们在开发的时候节省了不必要的代码,提高了开发效率。

KVC键值对编码

KVC的操作方法由NSKeyValueCoding协议提供,NSObject就实现了这个协议,也就是说如果对象是NSObject的子对象那么就支持KVC操作,KVC有两种操作方法,一种是设值,一种是取值,可以理解为getter和setter,不过稍微有所不同的是,设置对象值的方法中有两个,setValue:属性值 forKey:属性名(一般的设置,比如说是说设置NSString,NSNumber等基本类类型,setetValue:属性值 forKeyPath:属性路径(定义两个对象,Person和Book,Person有一个类型为Book的属性,如果需要在Person中设置Book的值,那么可以使用此方法),读取的也有两种valueForKey:属性名、valueForKeyPath:属性名。

Person.h中的代码:

//

// Person.h

// BugDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

#import "Book.h"

@interface Person : NSObject

@property (strong,nonatomic) NSString *Name;

@property (strong,nonatomic) Book *Book;

@end

Book.h中的代码:

//

// Book.h

// BugDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

@interface Book : NSObject

@property (strong,nonatomic) NSString *BookName;

@end

Person中Book属性的类型是Book类型,看下主函数中简单调用:

Person *person=[[Person alloc]init];

[person setValue:@"FlyElephant" forKey:@"Name"];

Book *book=[[Book alloc]init];

person.Book=book;

//路径设置

[person setValue:@"天涯明月刀" forKeyPath:@"Book.BookName"];

NSLog(@"%@",[person valueForKey:@"Name"]);

NSLog(@"%@",book.BookName);

NSLog(@"%@",[person valueForKeyPath:@"Book.BookName"]);

NSLog(@"%@",person.Book.BookName);

最终的打印结果就是FlyElephant和天涯明月刀,需要注意的是一句就是需要先赋值一个对象给Person中Book属性,不然是无法成功的:

Book *book=[[Book alloc]init];

person.Book=book;

KVO观察者模式

Key-Value Observing (KVO) 建立在 KVC 之上,能够观察一个对象的 KVC key path 值的变化,接下来的做的实例是在iOS中视图的ViewDidLoad中实现的,跟KVC类似,不过可以监听值的变化,实现起来很简单addObserver添加观察,observeValueForKeyPath观察变化之后的事件,最后需要销毁以下监听事件,概念就这么简单,具体的可以看一下:

新建博主(Blogger)和Article(文章)类:

Article.h声明:

//

// Article.h

// KVDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

@interface Article : NSObject

@property (strong,nonatomic) NSString *ArticleName;

@end

Blogger.h代码:

//

// Bloger.h

// KVDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

#import "Article.h"

@interface Blogger : NSObject

@property (strong,nonatomic) NSString *Name;

@property (strong,nonatomic) NSString *Url;

@property (strong,nonatomic) Article *MyArticle;

@end

然后故事板中拖一个Button和一个TextField文本框,然后点击的时候改变文本框的文字:

首先在ViewDidLoad中添加以下代码,注意addObserver方法:

_blogger=[[Blogger alloc]init];

//设置名称

[_blogger setValue:@"FlyElephant" forKey:@"Name"];

//设置Url

[self.blogger setValue:@"http://www.cnblogs.com/xiaofeixiang" forKey:@"Url"];

//设置观察者,options通知的对象形式

[self.blogger addObserver:self forKeyPath:@"Name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

//设置文本

[_myTextField setText:[_blogger valueForKey:@"Name"]];

self.Article=[[Article alloc]init];

[self.blogger setValue:self.Article forKey:@"MyArticle"];

[self.blogger setValue:@"KVC和KVO的理解" forKeyPath:@"MyArticle.ArticleName"];

按钮点击事件:

- (IBAction)blogObserver:(id)sender {

NSLog(@"blogObserver");

[self.blogger setValue:@"Keso" forKey:@"Name"];

}

OC中要实现KVO则必须实现NSKeyValueObServing协议,不过NSObject已经实现了该协议,直接重写observeValueForKeyPath即可:

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

NSLog(@"observeValueForKeyPath");

if ([keyPath isEqualToString:@"Name"]) {

// [_myTextField setText:[_blogger valueForKey:@"Name"]];

[_myTextField setText:_blogger.MyArticle.ArticleName];

}

}

最后销毁监听事件:

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

[self.blogger removeObserver:self forKeyPath:@"Name"];

}

最终实现效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python stdin和stdout_stdin似乎比stdout(python)慢得多.为什么?

我有两个需要相互通信的python程序(一个是子进程).目前我通过stdin和stdout这样做.然而,写入子进程的标准似乎很慢.a.py,一个采用任意行输入并打印时间的程序:from time import time, sleepfrom sys import stdout, stdinwhile True:stdin.readline()stdout.write(%…

postman生成python代码_别再用手敲了,这个工具可以自动生成python爬虫代码

我们在写爬虫代码时,常常需要各种分析调试,而且每次直接用代码调试都很麻烦所以今天给大家分享一个工具,不仅能方便模拟发送各种http请求,还能轻松调试,最重要的是,可以将调试最终结果自动转换成爬虫代码&a…

电工结业试卷_电工技术基础结业考试试卷

电工技术基础结业考试试卷适用年级2016级秋6班电子、计算机专业班级 姓名 学号一、 判断题(每题2分,共30分)1、 电位越高则电压越大。2、万用表的电压、电路及电阻档的刻度都是均匀的。3、 在任何情况下,电压源和电流源之间总是可以等效变换的。 4、 电容…

表格里面怎么打多个√_Excel怎样在表格里打√?

我们做表的时候有时会遇到输入对或错的情况。Excel表格里面输入√和,普通的方法是直接插入特殊符号来进行对勾的输入。这样输入起来1个2个还可以接受,但是如果频繁输入,那我们得想想简单方法。比如我们直接在excel单元格里面输入1显示√&…

@value 默认值为null_JAVA8之妙用Optional解决判断Null为空的问题

引言在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示在这种情况下,有如下代码user.getAddress().getProvince();这种写法,…

mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...

最近发现最代码网站中的收到的评论,提到我的,心情被赞的查询异常缓慢,通过nginx日志发现响应时间快的在5s,慢的有13s,终于忍无可忍花时间来解决了。执行explain之后的截图如下:可以看到possible_keys中有很…

php用到的mysql语句_PHP中常用到的一些MySQL语句_php

在php开发中,经常会使用到mysql语句,下面就为您列举了一些经常使用的MySQL语句,希望对您平时的学习和开发工作能起到些许的作用。MySQL语句显示数据库或表:show databases;//然后可以use database_name;show tables;MySQL语句更改表名:alter …

mysql执行计划性能_MySQL SQL性能分析Explain执行计划

一. 执行计划返回信息详解①. 执行计划所含字段输出列含义id查询标识select_type查询类型table查询涉及的表partitions匹配到的分区信息type连接类型possible_keys可能选择的索引key实际使用的索引key_len实际使用的索引的长度ref和索引进行比较的列rows需要被检索的大致行数fi…

mysql定时作业_mysql 让一个存储过程定时作业的代码(转)

1、在mysql 中建立一个数据库 test1语句:create database test12、创建表examinfocreate table examinfo(id int auto_increment not null,endtime datetime,primary key(id));3 插入数据:insert into examinfo values(‘1‘,‘2011-4-23 23:26:50‘);4 …

table虚线边框_web前端工程师7天0基础到精通(TABLE+CSS制作《互联世纪网》)

项目七 项目实践:TABLECSS制作《互联世纪网》实践目标1、 熟悉CSS属性2、 熟练运用CSS属性控制网页样式3、 熟悉网页制作流程项目简介:通过上一章节的学习,我们了解了CSS样式能更加方便、有效地控制网页结构和布局网页元素,大大提…

mixamo骨骼_mixamo动作库的模型和动作绑定控制器的方法-上集

1.首先从网站下载带调好动作的文件fbx,我们将fbx场景文件转换成c4d场景文件。没转换之前转换之后选择场次,在文件菜单里找到当前场次到新文档!2.我们将模型重置为Tpose方便后续操作,没重置之前模型为k好的动作模式不能使用选中权重…

mysql 101_MySQL 调优/优化的 101 个建议!

原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境,但是思路是相…

数据安全:保护个人隐私和企业机密的关键

在当今数字化时代,数据已经成为了一种宝贵的资源。无论是个人还是企业,都离不开数据的支持。然而,随着数据的不断增长和广泛应用,数据安全问题也日益突出。数据泄露、黑客攻击、网络诈骗等安全事件层出不穷,给个人和企…

python批量跑plsql_python实现自动化报表(Oracle/plsql/Excel/多线程)

# -*- coding: utf-8 -*-# Create time: 2019-10-16# Update time: 2019-11-28# Version: 1.0# Version: 2.0 增加多线程/出错自动重新运行模块# 导入模块import cx_Oracleimport osimport pandas as pdimport pandas.io.sql as sqlimport timeimport openpyxlimport xlwings a…

mysql 配置邮件_SQL 邮件配置篇

exec sp_configure show advanced options,1RECONFIGURE WITHOVERRIDEgoexec sp_configure database mail xps,1RECONFIGURE WITHOVERRIDEgo--2.创建邮件帐户信息EXECmsdb..Sysmail_add_account_spACCOUNT_NAME OCTMamiETL,--邮件帐户名称EMAIL_ADDRESS OCTMamiETL163.com,--发…

python 抽奖 配音乐_抖音上超好听的神曲音乐,Python教你一次性下载

不知道什么时候开始,中国出现了南抖音、北快手的互文格局(东市买骏马,西市买鞍鞯…)。刚才提到了,之前比较喜欢刷抖音,对于我这种佛系程序猿,看网上这些整容妹子基本一个样。喜欢抖音主要是两个初衷,学做菜…

mysql批量写入100万数据_Mysql数据库实践操作之————批量插入数据(100万级别的数据)-阿里云开发者社区...

第一种方法:使用insert into 插入从Redis每次获取100条数据,根据条件去插入到Mysql数据库中:条件:如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队列的头部每次获取100掉数据插入到…

mysql多客户端数据不同步_一种多终端设备上的数据同步方法

一种多终端设备上的数据同步方法【技术领域】[0001] 属于移动通信技术领域,特别是涉及基于离网环境下多种移动终端设备之间的数 据同步的方法。 技术背景[0002] 90年代未,数据同步始于有线连接,如MAC机作为数据中心,与终端设备(iP…

oem监控mysql_OEM12c 安装配置MySQL Plug-in用来监控MySQL

Plug-in--注册信息[roottest agent]# /oem/emcli setup -urlhttps://omsdb.localdomain:7301/em -usernamesysmanOracle Enterprise Manager 12c 3.Copyright (c) 1996, 2013 Oracle Corporation and/or its affiliates. All rights reserved.The configuration directory &quo…

怎么利用迭代器写入mysql_range()是什么?为什么不生产迭代器?

本篇文章给大家带来的内容是关于range()是什么?为什么不生产迭代器?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影&#x…