YYModel 原始碼歷險記(五)YYModelPropertyMeta 神奇的 next

發表於2016-06-13

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. 最後

堅持每天讀原始碼計劃繼續開啟,在學原始碼的過程中我發現很多可以吸收的東西,不斷的一個查缺補漏的過程,很多東西自己沒想到的通過讀原始碼都能學習到,就按毛主席說的“不會的那就抄一遍”,不會的東西那就讀多幾遍,願共勉。

相關文章