第三方框架學習—YYKit

ibireme和YYKit

可以看一下唐巧對ibireme的採訪
搜索一下ibireme的微博
簡言之,渴望成爲iOS大牛的新人,只有兩條捷徑,一是大量地閱讀優秀項目的源代碼,另一個就是自己動手實踐來嘗試。

YYKit

YYKit 是一組龐大、功能豐富的 iOS 組件。
爲了儘量複用代碼,這個項目中的某些組件之間有比較強的依賴關係。爲了方便其他開發者使用,我從中拆分出以下獨立組件:

  • YYModel — 高性能的 iOS JSON 模型框架。
  • YYCache — 高性能的 iOS 緩存框架。
  • YYImage — 功能強大的 iOS 圖像框架。
  • YYWebImage — 高性能的 iOS 異步圖像加載框架。
  • YYText — 功能強大的 iOS 富文本框架。
  • YYKeyboardManager — iOS 鍵盤監聽管理工具。
  • YYDispatchQueuePool — iOS 全局併發隊列管理工具。
  • YYAsyncLayer — iOS 異步繪製與顯示的工具。
  • YYCategories — 功能豐富的 Category 類型工具庫。

    YYModel的學習

    iOS開發總會用到各種JSON模型轉換庫,本人最常用的MJExtension(小碼哥出品),轉換效率很高,使用也比較簡單,只要前後臺約定好,json直接就轉成了model。另外還有JSONModel,Mantle,FastEasyMapping,Manually等等。關於這幾個庫的測評,可以點擊ibireme的iOS JSON 模型轉換庫評測
    《iOS JSON 模型轉換庫評測》
    本文中ABCDE表示等級,A爲最佳,E爲最差(僅爲個人學習用)
  性能 容錯性 功能 侵入性
Mantle E B 會進行對象類型檢查 A 可定製性最高 B 需要 Model 繼承自某個基類,靈活性稍差,但功能豐富
JSONModel C 和 MJExtension 差不多,Mantle 性能高 D 沒有對錯誤類型的檢測,沒有對 App 的保護 B 使用比較簡單,但功能相對 Mantle 稍弱 B 需要 Model 繼承自某個基類,靈活性稍差,但功能豐富
MJExtension C 和JSONModel 差不多,Mantle 性能高 C 對部分對象進行自動轉換 B 使用比較簡單,但功能相對 Mantle 稍弱 A- Category 方式來實現,添加了一些沒有前綴的方法,易引起衝突
FastEasyMapping B 較快 E 沒有自動轉換的機制 C 功能最少,使用也不算方便 C 採用工具類來實現,使用靈活,但不方便
YYModel A 快,接近手寫代碼的效率 A 會進行對象類型檢查 B 使用比較簡單,但功能相對 Mantle 稍弱 A Category 方式來實現

附錄:原文中關於YYModel的幾個優化tips不錯,大家可以學習一下!

  1. 緩存
    Model JSON 轉換過程中需要很多類的元數據,如果數據足夠小,則全部緩存到內存中。

  2. 查表
    當遇到多項選擇的條件時,要儘量使用查表法實現,比如 switch/case,C Array,如果查表條件是對象,則可以用 NSDictionary 來實現。

  3. 避免 KVC
    Key-Value Coding 使用起來非常方便,但性能上要差於直接調用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能會有較大提升。

  4. 避免 Getter/Setter 調用
    如果能直接訪問 ivar,則儘量使用 ivar 而不要使用 Getter/Setter 這樣也能節省一部分開銷。

  5. 避免多餘的內存管理方法
    在 ARC 條件下,默認聲明的對象是 strong 類型的,賦值時有可能會產生 retain/release 調用,如果一個變量在其生命週期內不會被釋放,則使用 unsafe_unretained 會節省很大的開銷。
    訪問具有 weak 屬性的變量時,實際上會調用 objc_loadWeak() 和 objc_storeWeak() 來完成,這也會帶來很大的開銷,所以要避免使用 weak 屬性。
    創建和使用對象時,要儘量避免對象進入 autoreleasepool,以避免額外的資源開銷。

  6. 遍歷容器類時,選擇更高效的方法
    相對於 Foundation 的方法來說,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法來遍歷容器類能帶來不少性能提升,但代碼寫起來會非常麻煩。

  7. 儘量用純 C 函數、內聯函數
    使用純 C 函數可以避免 ObjC 的消息發送帶來的開銷。如果 C 函數比較小,使用 inline 可以避免一部分壓棧彈棧等函數調用的開銷。

  8. 減少遍歷的循環次數
    在 JSON 和 Model 轉換前,Model 的屬性個數和 JSON 的屬性個數都是已知的,這時選擇數量較少的那一方進行遍歷,會節省很多時間。

YYModel的特性

高性能: 模型轉換性能接近手寫解析代碼。
自動類型轉換: 對象類型可以自動轉換,詳情見下方表格。
類型安全: 轉換過程中,所有的數據類型都會被檢測一遍,以保證類型安全,避免崩潰問題。
無侵入性: 模型無需繼承自其他基類。
輕量: 該框架只有 5 個文件 (包括.h文件)。
文檔和單元測試: 文檔覆蓋率100%, 代碼覆蓋率99.6%。

YYModel的代碼

字典轉模型

@interface HelpModel : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *html;
@property(nonatomic,copy)NSString *ID;
@end


Paste_Image.png


ps :導入NSArray分類

在VC中調用


Paste_Image.png

打印出的部分結果


Paste_Image.png

歸檔解檔

直接調用兩個方法


Paste_Image.png

數據校驗與自定義轉換



文/Iris_Fighting(簡書作者)
原文鏈接:http://www.jianshu.com/p/514ffb83868d
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章