Dictionary转Model的方法和YYModel的优化思路
客户端请求服务器,经常使用的时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