Kingfisher源码之Cache

2020-08-21  本文已影响0人  Mannyao

Kingfisher的的图片缓存有内存缓存和磁盘缓存两种,都是有ImageCache类负责;

ImageCache的功能:

  1. 缓存图片
  2. 检索图片
  3. 清理图片

1.缓存图片

缓存图片分为下面两种方式:

内存缓存

内存缓存是由NSCache完成的,具体实现设计是通过MemoryStroage枚举中的Backend 类实现;下面介绍内存缓存的Backend
Backend中两个重要的类型:

磁盘缓存

磁盘缓存是通过DiskStorage枚举中的Backend类实现,跟磁盘缓存同样的结构。
磁盘缓存中有个两个中重要类型:

2.检索图片

从初始化方法中可以看出ImageCache 连接MemoryStroage和DiskStorage。

  public init(memoryStorage: MemoryStorage.Backend<Image>,
                diskStorage: DiskStorage.Backend<Data>) {
        self.memoryStorage = memoryStorage
        self.diskStorage = diskStorage
        let ioQueueName = "com.onevcat.Kingfisher.ImageCache.ioQueue.\(UUID().uuidString)"
        ioQueue = DispatchQueue(label: ioQueueName)
        
        let notifications: [(Notification.Name, Selector)]
        notifications = [
            (UIApplication.didReceiveMemoryWarningNotification, #selector(clearMemoryCache)),
            (UIApplication.willTerminateNotification, #selector(cleanExpiredDiskCache)),
            (UIApplication.didEnterBackgroundNotification, #selector(backgroundCleanExpiredDiskCache))
        ]
        notifications.forEach {
            NotificationCenter.default.addObserver(self, selector: $0.1, name: $0.0, object: nil)
        }
    }

1.先从内存缓存中检索,再从磁盘中找,尾随闭包是Result<ImageCacheResult, KingfisherError>

public enum ImageCacheResult {
    case disk(Image)
    case memory(Image)
    case none
    public var image: Image? {
        switch self {
        case .disk(let image): return image
        case .memory(let image): return image
        case .none: return nil
        }
    }
    public var cacheType: CacheType {
        switch self {
        case .disk: return .disk
        case .memory: return .memory
        case .none: return .none
        }
    }
}

3.清理图片

上面解释过情况内存缓存默认有一个120s的定时器,除了这个ImageCache监听了系统的三个通知,从上面ImageCache初始化中可以看出:在收到系统内存警告的时候清理内存缓存,在进入后台,以及终止程序的时候清理过期的磁盘缓存。

上一篇下一篇

猜你喜欢

热点阅读