YYModel 源码历险记(五)YYModelPropertyMeta 神奇的 next

1. 写在前面

之所以一个多星期没有继续看的原因是回学校考试了T T,考完回来发现Json to Model框架已经被别人写完没我的活了,被安排去做其他的了T T 心疼,虽然饭碗没了,但是学习还是要继续的,从之前看YYModel的YYClassInfo就开始慢慢觉得是一层又一层的封装,接下来我们看看YYModelPropertyMeta的实现

2. NSObject+YYModel 的私有方法

这几个方法提供了一系列判断以及转换的方法,将对接下来各个类的使用产生巨大的作用。

3. YYModelPropertyMeta 对propertyInfo信息描述的封装

我们可以看到这里再一次对YYClassPropertyInfo进行封装,可能一开始还看不出这里一层又一层的封装的目的,不要急,看完这个例子大概就知道为什么要这么做了,我们先来看一下.h文件:

这里可以看到是将YYClassPropertyInfo增加了一些描述信息,如_genericCls,_hasCustomClassFromDictionary等信息进行了封装,这里有个比较神奇的地方就是有个next指针,这个指针是不是看起来很熟悉,我们再看看这样的一个结构:

这不是我们之前学链表的时候的结构吗? 是的,这里用了一个链表,用了一个next指针将多个属性名映射同一个json key连接起来。EXO?什么叫多个属性名映射同一个json key? 我们先来了解一下json key的几种情况:

  1. json key 和 property 1对1

这种就是经常见到的一个属性对应一个key的情况

  1. json key 和 property 多对1

这种情况下,name,username,和user的值都将映射到属性name上

2.json key 是一个路径

以上三种就是我们经常能看到的关于json key的模式
接下来我们谈谈多个property对应一个json key的情况,很可能映射表是这样的:

在这里name、fullName、username都对应json中name这个字段,我们拿刚刚这个json key 映射来做分析

  1. 首先name最先得到映射,对mapKey进行赋值,取得json中的name字段进行赋值一系列操作,此时next指针为null
  2. fullName接着进行映射,对mapKey进行赋值,接着取得原来json key对应的属性描述对象,将fullName的next指针,指向前一个key映射的对象。
  3. username接着进行映射,对mapKey进行赋值,接着取得原来json key对应的属性描述对象,将username的next指针,指向前一个key映射的对象fullName。
    就是如下的一个关系:

677383-c43a21298b1a2f8c

next指针.png

这样做有什么用呢,我们可以看到这样用了一个链表把所有映射到同一个json key的属性串联起来,这样如果json key 字段里的值改了,我们可以看到最先得到映射的是name属性,有了这样一个表,其他几个属性只需要通过next指针就可以拿到对应jsonkey 修改了的值,这样是不是直接把需要修改的都串联起来了呢(初步解读是这样,如果还有其他作用,后面会做修改)

接下来我们看一下YYModelPropertyMeta实现文件里的方法

4. 最后

坚持每天读源码计划继续开启,在学源码的过程中我发现很多可以吸收的东西,不断的一个查缺补漏的过程,很多东西自己没想到的通过读源码都能学习到,就按毛主席说的“不会的那就抄一遍”,不会的东西那就读多几遍,愿共勉。

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部