先上流程圖

Kingfisher結(jié)構(gòu)流程圖.png
kf屬性的由來
通過實(shí)現(xiàn)KingfiserCompatibleValue協(xié)議
extension Image: KingfiserCompatibleValue { }
extension KingfiserCompatibleValue {
///獲取Kingfisher兼容類型的名稱空間占位符。
public var kf: KingfisherWrapper<Self> {
get { return KingfisherWrapper(self) }
set { }
}
}
/// 對kingfisher 兼容類型的包裝器. 這類型為kingfisher的便利初始化方法提供了一個擴(kuò)展點(diǎn)
public struct KingfisherWrapper<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
然后再通過擴(kuò)展KingfisherWrapper提供了setImage的方法
KingfisherManager可以說是Kingfisher的核心,它連接Kingfisher的下載和緩存鏈接ImageDownloader和ImageCache;提供了一個一系列的方便的方法,去執(zhí)行Kingfisher的任務(wù)。
先看初始化方法:
init(downloader: ImageDownloader, cache: ImageCache) {
self.downloader = downloader
self.cache = cache
let processQueueName = "com.onevcat.Kingfisher.KingfisherManager.processQueue.\(UUID().uuidString)"
processingQueue = .dispath(DispatchQueue(label: processQueueName))
}
直接初始化ImageDownloader和ImageCache
檢索圖片
func retrieveImage(with source: Source, options: KingfisherParedOptionsInfo, progressBlock: DownloadProgressBlock? = nil, completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask? {
if options.forceRefresh {
return loadAndCacheImage(source: source, options: options, completionHandler: completionHandler)
} else {
let loadedFromCache = retrieveImageFromCache(source: source, options: options, completionHandler: completionHandler)
if loadedFromCache {
return nil
}
if options.onlyFromCache {
let error = KingfisherError.cacheError(reason: .imageNotExisting(key: source.cacheKey))
completionHandler?(.failure(error))
return nil
}
return loadAndCacheImage(source: source, options: options, progressBlock: progressBlock, completionHandler: completionHandler)
}
}
利用ImageCache檢索圖片,利用ImageDownloader下載圖片