KVO和KVC简介
一、Key-Value-Observing--KVO(鍵值觀察者模式)(1)簡介:此機(jī)制可以在一個(gè)類中監(jiān)聽另外一個(gè)類的屬性變化,包括我們自己的類和已有的Cocoa類庫中的類。當(dāng)被監(jiān)聽的類的屬性發(fā)生了變化時(shí),觀察者會(huì)收到通知,可以針對(duì)屬性變化添加自己的動(dòng)作。(2)為被監(jiān)聽對(duì)象注冊觀察者:指定觀察者,要觀察的屬性的名稱,options可以傳0值。– addObserver:forKeyPath:options:context:(3)觀察者實(shí)現(xiàn)通知接收函數(shù):– observeValueForKeyPath:ofObject:change:context:(4)在不需要觀察者或者觀察者銷毀前移除觀察者:– removeObserver:forKeyPath:context:(5)當(dāng)被監(jiān)聽的對(duì)象的對(duì)應(yīng)key值發(fā)生更改時(shí),觀察者會(huì)收到通知,比如給屬性直接賦值,后者調(diào)用-setValue:forKey:方法。
二、KVO的通知觸發(fā)方式:(1)在觀察者類中實(shí)現(xiàn)+ automaticallyNotifiesObserversForKey:方法,當(dāng)返回YES時(shí),該key會(huì)在值發(fā)生改變時(shí)自動(dòng)觸發(fā)通知,如果返回NO,需要手動(dòng)觸發(fā)通知,在值改變前后加如下方法:– willChangeValueForKey: ? ?– didChangeValueForKey:(2)是自動(dòng)還是手動(dòng),根據(jù)實(shí)際情況定,默認(rèn)是自動(dòng)的。(3)當(dāng)直接賦值時(shí),要加上對(duì)象,如當(dāng)前對(duì)象的屬性改變時(shí)要加self,否則不觸發(fā)通知,需要手動(dòng)觸發(fā)。
三、KVO 依賴鍵+?(NSSet?*)keyPathsForValuesAffectingValueForKey:(NSString?*)key???? ???? +?(NSSet?*)keyPathsForValuesAffecting<Key> ?? 例如,information 屬性依賴于 target 的 age 和 grade 屬性,target 的 age/grade 屬性任一發(fā)生變化,information 的觀察者都會(huì)得到通知。
+?(NSSet?*)keyPathsForValuesAffectingInformation???? {???? ????NSSet?*?keyPaths?=?[NSSet?setWithObjects:@"target.age",?@"target.grade",?nil];???? ????return?keyPaths;???? }???? ???? +?(NSSet?*)keyPathsForValuesAffectingValueForKey:(NSString?*)key???? {???? ????NSSet?*?keyPaths?=?[super?keyPathsForValuesAffectingValueForKey:key];???? ????NSArray?*?moreKeyPaths?=?nil;???? ???????? ????if?([key?isEqualToString:@"information"])???? ????{???? ????????moreKeyPaths?=?[NSArray?arrayWithObjects:@"target.age",?@"target.grade",?nil];???? ????}???? ???????? ????if?(moreKeyPaths)???? ????{???? ????????keyPaths?=?[keyPaths?setByAddingObjectsFromArray:moreKeyPaths];???? ????}???? ???????? ????return?keyPaths;???? } ?? 要實(shí)現(xiàn)?keyPathsForValuesAffectingInformation??或?keyPathsForValuesAffectingValueForKey: 方法是告訴系統(tǒng) information 屬性依賴于哪些其他屬性,這兩個(gè)方法都返回一個(gè)key-path 的集合。
四、Key-Value-Coding--KVC(鍵值編碼)(1)該機(jī)制會(huì)把類的屬性作為一個(gè)key處理。(2)取值:[object valueForKey:@"key"];? ? 設(shè)值:[object setValue:@"value" forKey:@"key"];(3)KVO是基于KVC實(shí)現(xiàn)的。
二、KVO的通知觸發(fā)方式:(1)在觀察者類中實(shí)現(xiàn)+ automaticallyNotifiesObserversForKey:方法,當(dāng)返回YES時(shí),該key會(huì)在值發(fā)生改變時(shí)自動(dòng)觸發(fā)通知,如果返回NO,需要手動(dòng)觸發(fā)通知,在值改變前后加如下方法:– willChangeValueForKey: ? ?– didChangeValueForKey:(2)是自動(dòng)還是手動(dòng),根據(jù)實(shí)際情況定,默認(rèn)是自動(dòng)的。(3)當(dāng)直接賦值時(shí),要加上對(duì)象,如當(dāng)前對(duì)象的屬性改變時(shí)要加self,否則不觸發(fā)通知,需要手動(dòng)觸發(fā)。
三、KVO 依賴鍵
有時(shí)候一個(gè)屬性的值依賴于其他屬性值,那么如果其他屬性值發(fā)生變更,那么必然也就導(dǎo)致該屬性值的變更,也即 Dependent Poroperties。在KVO中,引入了依賴鍵
在KVO中,提供了如下兩種實(shí)現(xiàn) 依賴鍵 的方法:
[cpp]?view plain?copy?[cpp]?view plain?copy?
如果選擇實(shí)現(xiàn)?keyPathsForValuesAffectingValueForKey,要先獲取 super 返回的結(jié)果 set,然后判斷 key 是不是目標(biāo) key,如果是就將依賴屬性的 key-path 結(jié)合追加到 super 返回的結(jié)果 set 中,否則直接返回 super的結(jié)果。
注:顯然前者實(shí)現(xiàn)過程簡單。
四、Key-Value-Coding--KVC(鍵值編碼)(1)該機(jī)制會(huì)把類的屬性作為一個(gè)key處理。(2)取值:[object valueForKey:@"key"];? ? 設(shè)值:[object setValue:@"value" forKey:@"key"];(3)KVO是基于KVC實(shí)現(xiàn)的。
總結(jié)
- 上一篇: web处理高并发措施
- 下一篇: ajax delete 传递参数,spr