KVC(Key-value coding)鍵值編碼,類似于map,提供了一種使用字符串而不是訪問(wèn)器方法去訪問(wèn)一個(gè)對(duì)象實(shí)例變量的機(jī)制。KVO(Key-value observing)鍵值觀察,提供了一種當(dāng)其它對(duì)象屬性被修改的時(shí)候能通知當(dāng)前對(duì)象的機(jī)制。
用法: Model類 User.h @interface User : NSObject User.m @implementation User - (id)initWithDictionary:(NSDictionary *)jsonDictionary { self = [super init]; if(self){ [self setValuesForKeysWithDictionary:jsonDictionary]; } return self; } setValuesForKeysWithDictionary這個(gè)方法就是koc中的,用于匹配類中與字典key同名的屬性,并賦值給屬性,如果self是派生類,則會(huì)自動(dòng)匹配派生類進(jìn)行賦值。用這個(gè)來(lái)做json的映射看上面是很簡(jiǎn)單。 我們看看jsonDictionary的內(nèi)容: "id" : "0", "name" : "jack", "age" : 15, "sex" : "male" 那執(zhí)行完setValuesForKeysWithDictionary這個(gè)方法后User的屬性就都會(huì)有值了。 注意你的程序執(zhí)行到setValuesForKeysWithDictionary會(huì)崩潰。
仔細(xì)一點(diǎn)我們會(huì)發(fā)現(xiàn) json 里面的id和屬性里面的id不對(duì)應(yīng)。(對(duì)于id這個(gè)鍵來(lái)說(shuō),這個(gè)類不兼容鍵值編碼) KVO提供了一個(gè)解決方法setValue:forUndefinedKey:用于處理上面的情況 我們需要實(shí)現(xiàn)setValue:forUndefinedKey:這個(gè)函數(shù)- (void)setValue:(id)value forUndefinedKey:(NSString *)key { if([key isEqualToString:@"id"]) self.userId = value; } 這樣就沒(méi)事了,然后順便說(shuō)說(shuō),其實(shí)可以做一個(gè)model的基類,然后基類里面去做這些處理,如果有特殊的key可以在子類實(shí)現(xiàn): 子類: - (void)setValue:(id)value forUndefinedKey:(NSString *)key { if([key isEqualToString:@"id"]) self.userId = value; else [super setValue:value forKey:key]; } 然后基類里面也實(shí)現(xiàn)這個(gè)函數(shù): - (void)setValue:(id)value forUndefinedKey:(NSString *)key { NSLog(@"Undefined Key: %@", key); }這樣就不會(huì)崩潰了。 上面只是舉個(gè)例子,一般開(kāi)發(fā)建議Model基類里面去做上面的全部處理,然后子類做和自己相關(guān)的處理。 最后看一下調(diào)用 NSDictionary *responseDictionary = [completedOperation responseJSON]; User *user = [[User alloc] initWithDictionary:responseDictionary];這就是KVO的能力,比之前自己去解析json做數(shù)據(jù)對(duì)應(yīng)簡(jiǎn)單多了,同時(shí)如果服務(wù)器發(fā)送過(guò)來(lái)的json鍵名發(fā)生了變動(dòng),NSLog語(yǔ)句就會(huì)把未定義的鍵輸出到控制臺(tái),而不會(huì)崩潰。 在派生類中添加用于處理深復(fù)制的方法也是非常好的。只需要覆蓋NSCopying和NSMutableCopying中的方法就可以了 KVC還有很多有用的地方,簡(jiǎn)單了解一下: key就是確定對(duì)象某個(gè)值的字符串,它通常和accessor方法或是變量同名,并且必須以小寫字母開(kāi)頭。Key path就是以“.”分隔的key,因?yàn)閷傩灾狄材馨瑢傩?。比如我們可以person這樣的key,也可以有key.gender這樣的key path。 獲取屬性值時(shí)可以通過(guò)valueForKey:的方法,設(shè)置屬性值用setValue:forKey:。與此同時(shí),KVC還對(duì)未定義的屬性值定義了 valueForUndefinedKey:,你可以重載以獲取你要的實(shí)現(xiàn)(補(bǔ)充下,KVC定義在NSKeyValueCoding的非正式協(xié)議里)。 在O-C 2.0引入了property,我們也可以通過(guò).運(yùn)算符來(lái)訪問(wèn)屬性。下面直接看個(gè)例子: @property NSInteger number; instance.number =3; [instance setValue:[NSNumber numberWithInteger:3] forKey:@"number"]; 注意KVC中的value都必須是對(duì)象。 以上介紹了通過(guò)KVC來(lái)獲?。O(shè)置屬性,接下來(lái)要說(shuō)明下實(shí)現(xiàn)KVC的訪問(wèn)器方法(accessor method)。Apple給出的慣例通常是: -key:,以及setKey:(使用的name convention和setter/getter命名一致)。對(duì)于未定義的屬性可以用setNilValueForKey:。 |
|
來(lái)自: 沒(méi)原創(chuàng)_去搜索 > 《IOS系列》