字典转模型
1.老方法:按照字典中的key创建模型的属性,然后为模型创建一个方法,接收字典参数,在方法里进行属性赋值。依次按照item.url = dict[@"url"];这个步骤给属性赋值,最后返回item完成转模型。
弊端:慢,费力。如果字典中需要转模型的比较少,这么写也还算可以,一旦需要转化的属性变多,会又慢又累。
2.KVC方法字典转模型:还是按照字典中的key创建模型的属性,然后为模型创建一个方法,接收字典参数,在方法里进行属性赋值。在方法里调用一个方法就搞定了。
KVC字典转模型方法KVC原理:
KVC实现原理弊端:在遍历字典中的key的时候,如果没有在模型中找到对应的属性,系统会调用这个方法,报错
报找不到的错误解决办法就是重写这个方法,然后方法体里不作实现,就不会报错了,也不用担心模型中的属性少于字典中的属性会报错了,可以自己创建重要的,需要的模型属性进行转化。
3.MJEctension框架转模型 runtime:可以把一个模型中所有属性遍历出来,KVC转模型的时候是根据字典中的key,寻找到模型中相应的属性,进行赋值。而MJExtension框架转模型的过程恰恰相反,他是遍历模型中的属性,然后根据模型中的属性去寻找字典中的key,然后将value赋值给相应的模型属性。
什么是二级转换?正常的字典转模型,将字典中的值赋给模型属性,属于一级转换。而当模型的属性中还有字典类型的数据时,还需要对其再次进行转模型操作,这就是二级转换。
记录一下自己的理解,在给NSObject类写的分类中添加方法。创建对象的时候使用[[self alloc] init];为了让生成的对象跟随调用者的变化而变化。要使用runtime还是要导入头文件<objc.message.h>。 调用class_copyIvarList(self,&count);方法拿到self类的成员变量的数量赋给count,方法返回一个数组,使用Ivar *ivarList接收。
然后在循环中遍历数组中的成员变量,使用ivar_getName()方法获取成员变量名字。然后将成员变量的名字作为key,去传入的字典中查找相应的value,然后给objc对象setValue forKey就OK。这是一级转换,想要二级转换的话,就要在拿到字典对应的key的value时,判断value的类型,如果value类型是字典,就通过ivar_getTypeEcodeing()方法获取成员变量类型,然后经过裁剪,使用NSSClassFromString()创建模型中变量的类型的类,然后再使用这个类,再次递归调用modelWithDict方法,就完成了二级转换。
网友评论