問題:
首先我們先來了解一下字典轉模型,當我們從服務器請求并解析完數據后,我們通常需要把解析后得到的字典轉為模型(這里就不討論字典嵌套數組,數組又嵌套字典的情況了),面向模型開發,即有利于代碼的閱讀,編寫代碼時又能避免字典字段無提示的尷尬.
提到字典轉模型,我們通常使用KVC,KVC的底層實現思路是:
1.遍歷解析后的字典中的key,根據key去模型中找與key同名的setter方法,然后把key對應的value賦值給該setter方法對應的屬性
2.如果找不到同名setter方法,則找模型中與key同名的屬性,然后把key對應的value賦值給該屬性
3.如果同名屬性也找不到,就會去找帶下劃線的同名成員變量,然后把value賦值給該成員變量
4.如果連帶下劃線的成員變量也找不到,那么就會報錯了,為了防止報錯,我們通常會實現setvalue:forundifinekey方法.
通過以上介紹,我們知道,KVC會遍歷字典內全部的key,此時我們模型中需要賦值的屬性可能只有三五個,但實際情況模型一般都有十幾個屬性.另外,我們還有實現setvalue:forundifinekey方法以防止找不到同名key.
解決:
如果我們利用runtime,就可以避免這種情況了,runtime是遍歷模型中的屬性,然后去字典中尋找對應的key,然后把value賦值給屬性.
大概思路:
先使用runtime的函數取出模型的成員變量(這里不取屬性,因為有些可能直接聲明成員變量,沒有聲明屬性,而聲明了屬性的話一定會生成成員變量),得到成員變量名稱數組,然后創建一個新的字典,key值為所得到的變量名稱,value為原字典中key所對應的value,,最后再使用KVC即可.
//ivar表示成員變量
//第一個參數表示要獲取哪個類的成員變量列表
//第二個是成員變量的數量,傳入一個指針
class_copyIvarList(<#__unsafe_unretained Class cls#>, <#unsigned int *outCount#>)