Dictionary转Model的方法和YYModel的优化思路

字数 667阅读 459

客户端请求服务器,经常使用的时JSON方式传递数据。请求回来的JSON文件在客户端通常需要一些方式去转换成数据层需要的Model。其中Manually转换的思路都是差不多的,但有一些第三方开源库可以帮助我们方便地去转换,比如YYModel, JSONModel等 本文主要记录的是手动转换的思路和对几个转换第三方库代码的比较

一、假设我们自己去转换,应该怎么做?

(1)首先把拿到的JSON转换成为Dictionary

(2)把Dictionary转化为我们已经定义好的Model

经过第一步,已经拿到所需的Dictionary,目的是把其中key和value转化为目标Model的property和value。

这一步有两种思路

思路1:利用KVC进行转换

遍历字典中的key值,去模型类里面去查找有没有所对应的key。由于有可能会有没有定义的property而导致crash,所以要重写forUndefinedKey的方法。

思路2:利用Runtime进行转换


两种思路的对比:

KVC是遍历字典中的key值,去模型类里面去查找有没有所对应的key,runtime反之是遍历属性在字典里面去查找有没有对应的key,在实际开发中,因为后台返回的数据比较多,可用的字段就比较少,所以用runtime效率较高。

二、YYModel的优化点

有好几个开源的第三方库都可以方便地JSON转Model,在下面的链接里对比也说得很清楚,主要的思路也是离不开runtime和KVO,但是在其之上这些库使用起来的区别在于:如何用(继承还是Category),转换效率和容错机制。

https://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/#more-41804

稍微阅读了一下YYModel的代码,主要是用了以下几个思路来进行转换

(1) runtime 动态解析model数据类型;

(2) 运用Category的形式去给Object添加方法;

(3) 对解析出来的property, Ivar, method数据进行内存缓存,其中尽量使用switch的方式查表操作;

(4) 可以自定义映射关系,并且会做容错转换;

(5) 用了很多纯C函数,inline函数和CoreFoundation方法来获得更高的效率;

Reference:

https://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/#more-41804

https://www.jianshu.com/p/25e678fa43d3

https://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/#more-41804

推荐阅读更多精彩内容

  • 概述 ​ iOS源码解析—YYModel(YYClassInfo)分析了如何根据OC的Class对象构建...
  • 第二次的预售结束了,和第一次预售结束一样,让自己放松了几天,说是放松其实不然,并没有工作时的充实,有时候忙碌的工作...
  • 感谢每天早上完全属于自己的这20分钟,我心随我愿!
  • 在这一周里我们仍然过得很充实,不过有一件事令我非常伤心。 就是哥哥姐姐们都走了,我心里非常的不舍,...
  • 文/静话心是 昨天到今天 从黑夜到白天 前年到了去年 去年又到今年 再一年 也许还有很多个昨天与今天,去年和今年 ...