Kingfisher源码解析
2020-08-25 本文已影响0人
Mannyao
先上流程图
Kingfisher结构流程图.png
kf属性的由来
通过实现KingfiserCompatibleValue协议
extension Image: KingfiserCompatibleValue { }
extension KingfiserCompatibleValue {
///获取Kingfisher兼容类型的名称空间占位符。
public var kf: KingfisherWrapper<Self> {
get { return KingfisherWrapper(self) }
set { }
}
}
/// 对kingfisher 兼容类型的包装器. 这类型为kingfisher的便利初始化方法提供了一个扩展点
public struct KingfisherWrapper<Base> {
public let base: Base
public init(_ base: Base) {
self.base = base
}
}
然后再通过扩展KingfisherWrapper提供了setImage的方法
KingfisherManager可以说是Kingfisher的核心,它连接Kingfisher的下载和缓存链接ImageDownloader和ImageCache;提供了一个一系列的方便的方法,去执行Kingfisher的任务。
先看初始化方法:
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下载图片