我眼中的開源庫源碼之JSONModel(二)

我們接著上回的思路看,上面第一行就是一個條件編譯。

#if !__has_feature(objc_arc)

#error The JSONMOdel framework is ARC only, you can enable ARC on per file basis.

#endif

意思就是 JSONModel 只支持 arc 并不支持 marc 。

之后是3段全局變量的聲明

#pragma mark - associated objects names

static const char * kMapperObjectKey;

static const char * kClassPropertiesKey;

static const char * kClassRequiredPropertyNamesKey;

static const char * kIndexPropertyNameKey;

#pragma mark - class static variables

static NSArray* allowedJSONTypes = nil;

static NSArray* allowedPrimitiveTypes = nil;

static JSONValueTransformer* valueTransformer = nil;

static Class JSONModelClass = NULL;

#pragma mark - model cache

static JSONKeyMapper* globalKeyMapper = nil;

分別是關聯(lián)引用的 Key ,類的靜態(tài)全局變量,還有一個 globalKeyMapper 。為什么要使用關聯(lián)引用?因為關聯(lián)引用可以在不關注具體實現(xiàn)的情況下存儲鍵值,而且多個子類之間互不影響,也不會暴露屬性給子類具有良好的封裝。用在需要被繼承的 JSONModel 上好處不言而喻。

kMapperObjectKey 為了保存子類自己 Mapper

kClassPropertiesKey 為了保存類中的屬性在 runtime 中的解析結果

kClassRequiredPropertyNamesKey 儲存必須解析的屬性名

kIndexPropertyNameKey 儲存符合 Index 協(xié)議的屬性名

接下來使用的全局靜態(tài)變量是因為這些值都是在 JSONModel 類中初始化不需要改變的值,子類不能修改,需要使用。命名非常直觀大家可以非常簡單的通過代碼讀出。

進入代碼部分整個代碼因為上一篇講過了,整個的初始化入口均為 Dictionary 其他的初始化也都是調(diào)用該方法。而第一個執(zhí)行的肯定是 load 方法,為 JSONModel 做了必要的初始化工作。

-(id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err

該方法首先先調(diào)用了init方法中的 __setup__ 方法,在runtime環(huán)境中對 class 對象的屬性進行解析,舉個例子 T@\"NSString\",R,GisIntReadOnlyGetter,V_intReadOnlyGetter 這就是屬性的描述,大概說下,T是一個開頭字段 @ 表示為一個 OC 對象, NSString 為屬性類型,為復合的協(xié)議,R 為只讀,G 為 GcustomGetter 后面跟著名字,V 是屬性的名字。

在 initWithDictionary 中有兩個主要的方法

-(BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMapper:(JSONKeyMapper*)keyMapper error:(NSError**)err

主要用來處理 mapper 的操作和對數(shù)據(jù)完整性的解析。

-(BOOL)__importDictionary:(NSDictionary*)dict withKeyMapper:(JSONKeyMapper*)keyMapper validation:(BOOL)validation error:(NSError**)err

主要用來對 JSON 數(shù)據(jù)解析并賦值。

以上是JSONModel庫的整體流程的梳理。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • JSONModel 一個解析 JSON 數(shù)據(jù)的開源庫,可以將 JSON 數(shù)據(jù)直接解析成自定義的 model ,其中...
    lxyeslxlx11閱讀 839評論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,084評論 0 9
  • 前言 如今基本都是客戶端請求服務器的模式,數(shù)據(jù)傳遞方式基本都使用JSON的字符串方式。然而當我們獲取了服務器發(fā)來的...
    Alibsolute閱讀 5,332評論 6 4
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,655評論 30 472
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,846評論 0 4

友情鏈接更多精彩內(nèi)容