字典转模型KVC和runtime二者实现与区别

       我们知道在开发中,字典转模型是一种很常用的设计模式,当字典中元素的个数比较少的时候,我们可以直接用dic[key]去给模型对象的属性赋值,但是当字典中元素的个数比较多的时候,再用前面的解决方法就不行了,所以就有了KVC(key value coding:键值编码)字典转模型的设计模式。


KVC的设计原理:

[item setValue:@"value" forKey:@"property"]:

1.首先去模型中查找有没有setProperty,找到,直接调用赋值 [self setProperty:@"value"]

2.去模型中查找有没有property属性,有,直接访问属性赋值  property = value

3.去模型中查找有没有_property属性,有,直接访问属性赋值 _property = value

4.找不到,就会直接报错 setValue:forUndefinedKey:报找不到的错误


但是我们常用的KVC去实现有三个条件:

1.必须保证模型中定义的属性要大于或等于字典中key的数量。

2.模型中的基本数据类型无法进行转换。

3.属性的名字必须和键相同,否则找不到相关属性会报错


    KVC的实现模式是取出字典中的键值,去模型中找与之对应的属性,那么反之考虑,我们能不能抓取模型中的属性对象,去字典中找对应的键值呢?所以这就要考虑用到运行时机制runtime了。我们先获取到模型对象的属性名,将他们加入到一个数组当中,然后遍历数组,在遍历过程中给属性对象赋值。这也是KVC和runtime用于实现字典转模型的区别之一。下面我们就用代码实现下runtime下的字典转模型实现:


在model的分类中去实现以下方法

这个地方涉及到一个二级转换的问题,就是去字典中查找对应的Value的时候,value值可能又是一个字典,那么需要将其再次进行模型转换,代码实现如下:

二级转换:判断下value是否是字典,如果是,字典转换层对应的模型

// 并且是自定义对象才需要转换

if ([value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"]) {

// 转换成哪个模型

// 获取类

Class modelClass = NSClassFromString(ivarType);

value = [modelClass modelWithDict:value];

}

推荐阅读更多精彩内容

  • 一 快速生成@property 1 当我们需要用模型去实现一个比较小的功能的时候,由于我们需要对plist文件进行...
    莫许阅读 362评论 1 1
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,454评论 7 64
  • 很多时候我们需要把从服务器端请求下来的数据转成model类,今天就介绍一下如何利用runtime实现字典转模型 1...
    lkkwxy阅读 4,124评论 7 15
  • (1) 金钱≠财富 俗话说,钱是身外之物,生不带来,死不带去,对于活在此时此刻的人来说,健康是他最大的财...
    赵永海阅读 242评论 0 1
  • 十一月的最后一天,转眼已经在船上待了两个月。 看看这窗外繁华的灯火,就能知道这个城市的文明程度。虽然这里被光秃秃的...
    大皖安利阅读 73评论 0 0
  • 微课是在较短的时间内对某一个知识点进行充分的、有趣的讲解,符合当今紧张的学习生活节律,受到广泛的复制和传播,...
    速课阅读 1,775评论 0 1