kingfisher github位址
kingfisher
是swift
語言編寫的一款非常受歡迎的載入庫,功能和oc
語言編寫的sdwebimage
類似。作者貓神是我初入ios開發到現在都很崇拜的偶像。
imageview.kf.setimage(with: imageurl)
複製**
從上面的使用方法可以看出kingfisher
的使用方法非常簡單,那麼裡面是怎麼實現的呢?
關鍵點: kingfisher不知道你是否對上面使用方法中的
kf
好奇,我記得我第一次使用的時候,還不是這種寫法。下面來揭開它的神秘面紗:
public
final
class
kingfisher
}public
protocol
kingfishercompatible
}public
extension
kingfishercompatible
}}extension
imageview: kingfishercompatible
複製**
1.先定義了乙個不可繼承的kingfisher
類,他有乙個泛型屬性base。
2.然後定義了乙個kingfishercompatible
協議,定義了乙個唯讀的kf
關聯型別屬性。
3.在擴充套件中實現了kingfishercompatible
協議,指定關聯型別為kingfisher
,這裡的self理解為協議約束,需要遵守kingfishercompatible
協議的型別,例如這裡的就是image
。
4.imageview遵守kingfishercompatible協議。
然後就可以使用了,imageview+kingfisher.swift
中:
extension
kingfisher
where
base: imageview
複製**
這裡看上去是在給kingfisher
新增擴充套件,其實是給imageview
,因為kingfisher
中的base
屬性其實就是imageview
的例項物件,我們只需要在新增的方法中用base
代替我們直接給uiimageview新增擴充套件中的self
就行了。
但是目前這種寫法有乙個限制,那就是結構體無法使用,因為kingfisher
中的self
是不支援結構體的,如果結構體也想要使用這種方法,那只有單獨寫,例如string+md5.swift
檔案中的:
public
struct
stringproxy
}extension
string: kingfishercompatible
}複製**
這裡和上面類似就不贅述了,我們自己的寫的工具庫或者三方也能自定義這樣的寫法來避免衝突.
關鍵點:kingfisheroptionsinfo
是乙個列舉,用來配置庫中的資訊,例如後台執行緒解碼,和出現的動畫等等.
這個方法主要配置了一些資訊,例如預設和載入指示器等等.然後就將獲取的任務轉交給了kingfishermanager
。 獲取成功後,根據配置的顯示動畫,獲取顯示並動畫顯示
公開分類方法
public
func
setimage
(with resource: resource?,
placeholder: placeholder? = nil,
options: kingfisheroptionsinfo? = nil,
progressblock: downloadprogressblock? = nil,
completionhandler: completionhandler? = nil)
-> retrieveimagetask
複製**
獲取:
public
func
retrieveimage
(with resource: resource,
options: kingfisheroptionsinfo?,
progressblock: downloadprogressblock?,
completionhandler: completionhandler?)
-> retrieveimagetask
複製**
關鍵點: imagecache,快取器。
關鍵點: imageprocessor,處理器。
@discardableresult
func
downloadandcacheimage
(with url: url,
forkey key: string,
retrieveimagetask: retrieveimagetask,
progressblock: downloadprogressblock?,
completionhandler: completionhandler?,
options: kingfisheroptionsinfo)
-> retrieveimagedownloadtask?
複製**
直接將任務交給了imagecache,嘗試從快取中獲取
func
trytoretrieveimagefromcache
(forkey key: string,
with url: url,
retrieveimagetask: retrieveimagetask,
progressblock: downloadprogressblock?,
completionhandler: completionhandler?,
options: kingfisheroptionsinfo)
複製**
downloadimage(with url: url,
retrieveimagetask: retrieveimagetask? = nil,
options: kingfisheroptionsinfo? = nil,
progressblock: image**********progressblock? = nil,
completionhandler: image**********completionhandler? = nil)
-> retrieveimagedownloadtask?
複製**
快取,分為記憶體快取和磁碟快取
open func
store
(_ image: image,
original: data? = nil,
forkey key: string,
processoridentifier identifier: string = "",
cacheserializer serializer: cacheserializer = defaultcacheserializer.default,
todisk: bool = true,
completionhandler: (()
-> void)? = nil)
複製**
根據配置從記憶體獲取或者從磁碟獲取獲取.
@discardableresult
open func
retrieveimage
(forkey key: string,
options: kingfisheroptionsinfo?,
completionhandler: ((image?, cachetype)
-> void)?)
-> retrieveimagedisktask?
複製**
這篇這一篇文章主要分析kingfisher
工作的主要流程,細節待後續文章分享。其中還有很多枝葉操作也是很有意思的。 《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
原始碼閱讀 Glide原始碼閱讀之with方法(一)
前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...
原始碼閱讀 Glide原始碼閱讀之load方法(二)
原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...