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.pswp.cn/news/534641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534641.shtml
英文地址,請注明出處:http://en.pswp.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…