Kingfisher命名空間有2種方式,一種是使用協議加上包裝器,另外一種是把類型定義在枚舉裏。參考協議KingfisherCompatible
和類型public enum MemoryStorage {}
,一個是空協議,擴展了一個kf計算屬性,但kf裏又有個base指向本身,另外一個是空枚舉,定義了帶有本身命名空間的類型,Alamofire5.0
中使用就是第二種數組
Kingfisher使用了大量的枚舉,我之前覺得枚舉就是爲了區分狀態,以提升代碼的可讀性,如今的理解是枚舉定義了含義相同,但行爲策略可能不一樣的一組值,好比KingfisherOptionsInfoItem
定義了Kingfisher的各類配置,但每種配置的意義可能徹底不相同,但都是配置,再ExpirationExtending
定義瞭如何更新過時時間,線程
協議是定義了某種能力,由協議遵循者去實現這些能力,可是因爲Swift中協議擴展的存在,就可讓協議本身就提供某些能力,只要讓協議遵循者去遵循協議,就能自動獲取這些能力,減小了遵循協議的複雜性。而且協議僅僅定義了某種能力,不涉及具體類型,更方面的去擴展。我比較喜歡的協議又Resource
,Placeholder
,Processor
3d
OptionSet相似於OC的按位枚舉,OptionSet遵循了RawRepresentable,須要提供了rawValue值,OptionSet還遵循了SetAlgebra能夠很方便的數組字面量進行賦值,我比較喜歡這個特性,第一次看到這麼寫public static let all: RectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]
,還挺迷糊的,怎麼能把一個數組賦值結構體呢code
高清大圖若是直接加載,會佔用較高的內存,爲了減小內存的加載,可使用下采樣進行加載高清大圖,這也是Kingfisher的demo中展現高清圖的方式,這種方式有個弊端,就是若是咱們須要對高清圖進行方法展現的,可能會變的模糊,這時候可以使用CATiledLayer
展現高清圖,它可分段繪製cdn
通常圖片格式的都在data的前幾個字節裏,只要按對應的規則去取,而後進行判斷就好了blog
在子線程對圖片進行解碼就是在子線程裏把UIImage裏畫到一個畫布上,從畫布上取出畫好的圖片繼承
從下圖中可看到context建立了2此,須要釋放2次,釋放只能在繪畫以後才能釋放,若是不用defer,你會怎麼寫 圖片
這裏是由於對於每一個配置項都有一個默認值或者對配置項爲nil作了默認處理。這裏還想說一下,咱們在配置options的時候,options的類型是public typealias KingfisherOptionsInfo = [KingfisherOptionsInfoItem]
,Kingfisher中真正用的時候是結構體KingfisherParsedOptionsInfo
,因爲配置項屬性太多,直接使用結構體,初始化結構體的時候不方便,而使用數組,再經過遍歷生成KingfisherParsedOptionsInfo
,會方便不少,爲喵神的細節處理點贊內存