问题:
首先我们先来了解一下字典转模型,当我们从服务器请求并解析完数据后,我们通常需要把解析后得到的字典转为模型(这里就不讨论字典嵌套数组,数组又嵌套字典的情况了),面向模型开发,即有利于代码的阅读,编写代码时又能避免字典字段无提示的尴尬.
提到字典转模型,我们通常使用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#>)