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