iOS里面的模型映射的核心就是KVC。Let's start。
1。起源:你的App肯定有許多模型對(duì)象,但是如果都在這些模型對(duì)象里面,分別編寫KVC,那就麻煩了,所以,我們?cè)谶@里應(yīng)該寫個(gè)基類,來處理KVC,其他不同需求的事情交給子類。步驟1===》建立基于NSObject的類。我們叫做JSONModel
2。在JSONModel里面對(duì)外暴露一個(gè)方法:-(id)initWithDictionary:(NSDictionary *)dic;在這個(gè)方法里面,關(guān)鍵調(diào)用了一個(gè)方法,他就是 [self setValuesForKeysWithDictionary:dic],這個(gè)方法就是KVC,用來匹配類中與字典key同名的屬性。到這里KVC,核心字典轉(zhuǎn)模型對(duì)象就完成了。setValuesForKeysWithDictionary實(shí)際背后做了這幾個(gè)事情。他會(huì)調(diào)用這個(gè)方法:setKey1,setKey2,setKey3---,所以子類里面只需要實(shí)現(xiàn)setKey1,setKey2---之類的方法。最簡(jiǎn)單的做法就是,用@property? ? ? ? ? ? ? ? ? ? ? ? ? ? 步驟2===》在JSONModel.類里面實(shí)現(xiàn)-(id)initWithDictionary:(NSDictionary *)dic;方法里面的關(guān)鍵就是[self setValuesForKeysWithDictionary:dic]這句核心代碼 ? ? ? ? ? ? ? ? ? ? ? 步驟3===》建立基與JSONModel的模型對(duì)象類,頭文件就寫@,這些變量的名字要和傳入字典的key,他們名字要一致。
3.特殊處理。歷史原因就是fuck的后臺(tái)在返回的字典中,給我們一些這樣的字典 ? ? ? ? ? ? ?{@“id”: 1234, @"description":“這是第一個(gè)用戶”,@“imageUlr”:@“---”,----},那里面就有id,description,這2個(gè)key在轉(zhuǎn)模型對(duì)象的時(shí)候,在模型對(duì)象文件中,以“id”,@"descrption"做@property 名字就會(huì)有警告或者編譯出差的問題。所以就有了特殊處理。在服務(wù)器給你返回的字典中,與之對(duì)應(yīng)的對(duì)象模型類中,如果key里面有特殊關(guān)鍵字,首先,在@property里面名字改一下,比如userId, userDescription, 然后,你就再對(duì)象模型中多寫一個(gè)方法:- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ if([key isEqualToString:@"id"] ) ?self.userid = value; ?if([key isEqualToString@"description"] ?self.userDescription = value) ?else ?[super ?setValue:value forKey:key] };
4.我聽說Mantle這個(gè)庫的關(guān)鍵部分就是上面的,不知道是不是真的。反正上面幫助你理解那些開源庫是有幫助的,后面怎么優(yōu)化,那就參考開源庫的源碼了?。?!