定義: 把字典中的數(shù)據(jù)使用模型來保存亦鳞。新建一個類,根據(jù)字典中鍵值對,來編寫這個類中的屬性,將來用這個類的對象的屬性來保存字典中每個鍵對應(yīng)的值。
為什么要用字典去轉(zhuǎn)模型:
0>寫代碼的時候字典的鍵沒有智能提示,但是模型的屬性可以有智能提示
1>"鍵"是字符串,如果寫錯了,編譯器不報錯(在編譯的時候不報錯),運行時可能出錯,出錯了很難找錯更耻。
2>使用"模型"可以更方便的使用面向?qū)ο蟮?大特(封裝自沧、繼承纵柿、多態(tài))性進行擴展。
3>將來的這個"模型"可能會在很多地方被用到(比如有很多個控制器都會使用這個模型),那么每次用到模型的地方都需要寫一次把字典中的數(shù)據(jù)賦給模型屬性的代碼,此時如果把這些賦值語句封裝到模型內(nèi)部,會大大簡化了使用復(fù)雜度與代碼量鸯绿。
字典轉(zhuǎn)模型需要修改哪里的代碼:
1>創(chuàng)建一個模型類
2>在懶加載數(shù)據(jù)的時候,(或者網(wǎng)絡(luò)請求數(shù)據(jù)后)把加載到的數(shù)據(jù)都放到模型對象中,然后再把模型對象放到數(shù)組中跋破。
KVC: (鍵值編碼)
定義: 在對象創(chuàng)建完成之后,動態(tài)(牽扯到運行時)的給對象的屬性賦值
KVC簸淀,即是指 NSKeyValueCoding,一個非正式的Protocol毒返,提供一種機制來間接訪問對象的屬性租幕。而不是通過調(diào)用Setter、Getter方法訪問拧簸。
在OC的API中:
@interfaceNSObject(NSKeyValueCoding) // 非正式協(xié)議
用法:
1>基本取值賦值
賦值: [對象:setValue:forkey:]
取值:[對象.valueforKey]
2> 因為類key反復(fù)嵌套劲绪,所以有個keyPath的概念,keyPath就是用.號來把一個一個key鏈接起來盆赤,這樣就可以根據(jù)這個路徑訪問下去
3>KVC還有一個很重要的特點贾富,自動裝箱拆箱功能。這在ObjC中是僅有的牺六,其他情況下均需要使用比如NSNumber來手動拆裝箱的颤枪。
裝箱:把值類型轉(zhuǎn)換成引用類型 若是int 轉(zhuǎn)換成NSNumer或者NSString
拆箱:將引用類型轉(zhuǎn)換成值類型 與上面想反
4> KVC 還可以對NSArray和NSSet 進行賦值
5> 通過字典去進行賦值(不要忘了重寫那個方法)
[對象 setValuesForKeysWithDictionary:dict]
// 若對象沒有值
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
6> 在運行時給私有屬性或者可讀屬性進行賦值
//注意:(解檔和歸檔的方法不是KVC,而是NSCoding這個協(xié)議)
@protocolNSCoding
- (void)encodeWithCoder:(NSCoder*)aCoder;
- (nullableinstancetype)initWithCoder:(NSCoder*)aDecoder;
@end
KVO:(鍵值監(jiān)聽)
2、KVO的是KeyValue Observe的縮寫淑际,中文是鍵值觀察畏纲。這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知春缕。iOS中有個Notification的機制霍骄,也可以獲得通知,但這個機制需要有個Center淡溯,相比之下KVO更加簡潔而直接。
KVO的使用也很簡單簿训,就是簡單的3步咱娶。
注冊需要觀察的對象的屬性addObserver:forKeyPath:options:context:
實現(xiàn)observeValueForKeyPath:ofObject:change:context:
方法,這個方法當觀察的屬性變化時會自動調(diào)用
取消注冊觀察removeObserver:forKeyPath:context:
KVO:IOS里面的黑魔法,建議不要過多的使用,因為他的模式是一種輪詢的方式,比如,一直在敲門,直到打開門為止