KVO KVC做了簡單的介紹

2022-09-04 12:03:07 字數 2321 閱讀 4942

對kvo/kvc做了簡單的介紹,可作為入門讀物。

有些術語描述不夠精確請指正。

歡迎討論。

kvo是cocoa的乙個重要機制,他提供了觀察某一屬性變化的方法,極大的簡化了**。這種觀察-被觀察模型適用於這樣的情況,比方說根據a(數 據類)的某個屬性值變化,b(view類)中的某個屬性做出相應變化。對於推崇mvc的cocoa而言,kvo應用的地方非常廣泛。(這樣的機制聽起來類 似notification,但是notification是需要乙個傳送notification的物件,一般是 notificationcenter,來通知觀察者。而kvo是直接通知到觀察物件。)

適用kvo時,通常遵循如下流程:

1 註冊:-(

void

)addobserver:(nsobject 

*)anobserver forkeypath:(nsstring 

*)keypath options:(nskeyvalueobservingoptions)options context:(

void

*)context

keypath就是要觀察的屬性值,options給你觀察鍵值變化的選擇,而context方便傳輸你需要的資料(注意這是乙個void型)

2 實現變化方法:-(

void

) observevalueforkeypath:(nsstring 

*)keypath ofobject:(id)

object

change:(nsdictionary 

*)change context:(

void

*)context

change裡儲存了一些變化的資料,比如變化前的資料,變化後的資料;如果註冊時context不為空,這裡context就能接收到。

是不是很簡單?kvo的邏輯非常清晰,實現步驟簡單。

說了這麼多,大家都要躍躍欲試了吧。可是,在此之前,我們還需要了解kvc機制。其實,知道了kvo的邏輯只是幫助你理解而已,要真正掌握的,不在 於kvo的實現步驟是什麼,而在於kvc,因為只有符合kvc標準的物件才能使用kvo(強烈推薦要使用kvo的人先理解kvc)。

kvc是一種間接訪問物件屬性(用字串表徵)的機制,而不是直接呼叫物件的accessor方法或是直接訪問成員物件。

key就是確定物件某個值的字串,它通常和accessor方法或是變數同名,並且必須以小寫字母開頭。key path就是以「.」分隔的key,因為屬性值也能包含屬性。比如我們可以person這樣的key,也可以有key.gender這樣的key path。

獲取屬性值時可以通過valueforkey:的方法,設定屬性值用setvalue:forkey:。與此同時,kvc還對未定義的屬性值定義了 valueforundefinedkey:,你可以過載以獲取你要的實現(補充下,kvc定義載nskeyvaluecoding的非正式協議裡)。

在o-c 2.0引入了property,我們也可以通過.運算子來訪問屬性。下面直接看個例子:

@property nsinteger number;

instance.number =3

;[instance setvalue:[nsnumber numberwithinteger:

3] forkey:

@"number"];

注意kvc中的value都必須是物件。

-key:,以及setkey:(使用的name convention和setter/getter命名一致)。對於未定義的屬性可以用setnilvalueforkey:。

至此,kvc的基本概念你應該已經掌握了。之所以是基本,因為只涉及到了單值情況,kvc還可以運用到對多關係,這裡就不說了,留給各位自我學習的空間

接下來,我們要以集合為例,來對掌握的kvc進行一下實踐。

之所以選擇array,因為在ios中,array往往做為tableview的資料來源,有這樣的一種情況:

假設我們已經有n條資料,在進行了某個操作後,有在原先的資料後多了2條記錄;或者對n中的某些資料進行更新替換。不使用kvc我們可以使用 reloaddata方法或reloadrowsatindexpaths。前一種的弊端在於如果n很大消耗就很大。試想你只新增了幾條資料卻要過載之前 n資料。後一種方法的不足在於**會很冗餘,你要一次計算各個indexpath再去reload,而且還要提前想好究竟在哪些情況下會引起資料更新,

倘若使用了kvc/kvo,這樣的麻煩就迎刃而解了,你將不用關心追加或是更新多少條資料。

下面將以新增資料為例,說明需要實現的方法:

實現insertobject:inkeyatindex:或者insertkey:atindexes。同時在kvo中我們可以通過change這個dictionary得知發生了哪種變化,從而進行相應的處理。

KVO KVC做了簡單的介紹

對kvo kvc做了簡單的介紹,可作為入門讀物。有些術語描述不夠精確請指正。歡迎討論。kvo是cocoa的乙個重要機制,他提供了觀察某一屬性變化的方法,極大的簡化了 這種觀察 被觀察模型適用於這樣的情況,比方說根據a 數 據類 的某個屬性值變化,b view類 中的某個屬性做出相應變化。對於推崇mv...

mysql的簡單介紹 mysql的簡單介紹

mysql的簡單介紹 資料庫的內部鏈結 1 連線管理器 使用者或應用程式連線 2 分析器 3 快取區4 優化器 優化器執行的結果交由儲存引擎,再轉向物理層 表空間 myisam每個表有三個檔案 frm 表結構 myd 表資料 myi 表索引 innodb 所有表空間再乙個檔案 資料庫失敗的原因 1 ...

裝甲車團隊介紹(別急,在做了)

五人組隊即為車,一輛小破車吱吱呀呀,經歷泥濘與風雨。我們的目標是成為裝甲車,堅實可靠,無所畏懼。高強度的外表之下,是不可或缺的每一部分。我們也一無所有 但有動力就能前進。油滿!出發!隊員學號 部落格王永福 031702614 rtxux 吳宜航031702645 stolf 鮑子涵031702646...