閱讀Kingfisher源碼的一些收穫

1. 命名空間的使用

Kingfisher命名空間有2種方式,一種是使用協議加上包裝器,另外一種是把類型定義在枚舉裏。參考協議KingfisherCompatible和類型public enum MemoryStorage {},一個是空協議,擴展了一個kf計算屬性,但kf裏又有個base指向本身,另外一個是空枚舉,定義了帶有本身命名空間的類型,Alamofire5.0中使用就是第二種數組

2. 對枚舉的瞭解

Kingfisher使用了大量的枚舉,我之前覺得枚舉就是爲了區分狀態,以提升代碼的可讀性,如今的理解是枚舉定義了含義相同,但行爲策略可能不一樣的一組值,好比KingfisherOptionsInfoItem定義了Kingfisher的各類配置,但每種配置的意義可能徹底不相同,但都是配置,再ExpirationExtending定義瞭如何更新過時時間,線程

3. 協議對提升擴展性的重要做用

協議是定義了某種能力,由協議遵循者去實現這些能力,可是因爲Swift中協議擴展的存在,就可讓協議本身就提供某些能力,只要讓協議遵循者去遵循協議,就能自動獲取這些能力,減小了遵循協議的複雜性。而且協議僅僅定義了某種能力,不涉及具體類型,更方面的去擴展。我比較喜歡的協議又ResourcePlaceholder,Processor3d

4. OptionSet的使用

OptionSet相似於OC的按位枚舉,OptionSet遵循了RawRepresentable,須要提供了rawValue值,OptionSet還遵循了SetAlgebra能夠很方便的數組字面量進行賦值,我比較喜歡這個特性,第一次看到這麼寫public static let all: RectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight],還挺迷糊的,怎麼能把一個數組賦值結構體呢code

5. 加載高清大圖的加載

高清大圖若是直接加載,會佔用較高的內存,爲了減小內存的加載,可使用下采樣進行加載高清大圖,這也是Kingfisher的demo中展現高清圖的方式,這種方式有個弊端,就是若是咱們須要對高清圖進行方法展現的,可能會變的模糊,這時候可以使用CATiledLayer展現高清圖,它可分段繪製cdn

6. 加載GIF的2種方式

  1. 從GIF圖中獲取全部的圖片,利用UIImage.animateImage()生成一個動圖,賦值給UIImageView
  2. 自定義ImageView繼承自UIImageView,實現一個定時器根據相應的時間,展現GIF圖對應的那一幀圖片

7. 判斷圖片格式的原理

通常圖片格式的都在data的前幾個字節裏,只要按對應的規則去取,而後進行判斷就好了blog

8. 在子線程對圖片進行解碼

在子線程對圖片進行解碼就是在子線程裏把UIImage裏畫到一個畫布上,從畫布上取出畫好的圖片繼承

9. defer對提高代碼簡潔的幫助

從下圖中可看到context建立了2此,須要釋放2次,釋放只能在繪畫以後才能釋放,若是不用defer,你會怎麼寫 圖片

10. Kingfisher使用方式如此簡單,但也很方面的進行不少設置

這裏是由於對於每一個配置項都有一個默認值或者對配置項爲nil作了默認處理。這裏還想說一下,咱們在配置options的時候,options的類型是public typealias KingfisherOptionsInfo = [KingfisherOptionsInfoItem],Kingfisher中真正用的時候是結構體KingfisherParsedOptionsInfo ,因爲配置項屬性太多,直接使用結構體,初始化結構體的時候不方便,而使用數組,再經過遍歷生成KingfisherParsedOptionsInfo,會方便不少,爲喵神的細節處理點贊內存

相關文章
相關標籤/搜索