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的下载和缓存链接ImageDownloaderImageCache;提供了一个一系列的方便的方法,去执行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))
    }

直接初始化ImageDownloaderImageCache

检索图片

  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下载图片

上一篇下一篇

猜你喜欢

热点阅读