如何清除使用Kingfisher在UITableView中加载的图像的内存和磁盘缓存?

9

我需要释放使用Kingfisher获取的所有图片所占用的内存。我有一个存储了许多图像并具有“加载更多”功能的UITableView。

我尝试了以下措施。

在viewDidLoad()中,我设置了缓存大小。

let cache = KingfisherManager.sharedManager.cache
cache.maxMemoryCost = 50 * 1024 * 1024
// Set max disk cache to 50 mb. Default is no limit.
cache.maxDiskCacheSize = 50 * 1024 * 1024
// Set max disk cache to duration to 3 days, Default is 1 week.
cache.maxCachePeriodInSecond = 60 * 60 * 24 * 3

在 viewWillDisappear() 中,我正在清除这个。

cache.clearMemoryCache()
// Clear disk cache. 
cache.clearDiskCache()
// Clean expired or size exceeded disk cache.
cache.cleanExpiredDiskCache()

我的记忆仍然没有被正确清除,如果我漏掉了什么,请纠正我。

6个回答

19

在收到内存警告后,我清除了缓存,现在它对我来说运行良好:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    cache.clearMemoryCache()
    cache.clearDiskCache()
    cache.cleanExpiredDiskCache()
}

Swift 4 更新:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    KingfisherManager.shared.cache.clearMemoryCache()
    KingfisherManager.shared.cache.clearDiskCache()
    KingfisherManager.shared.cache.cleanExpiredDiskCache()
}

8

KingFisher in Swift 4

KingfisherManager.shared.cache.clearMemoryCache()
KingfisherManager.shared.cache.clearDiskCache()
KingfisherManager.shared.cache.cleanExpiredDiskCache()

4
根据文档
Kingfisher会在收到内存警告时清除内存缓存,以及在需要时清除过期和超出大小的缓存。通常情况下,无需自行清理缓存。这些方法存在是为了让您的用户对缓存拥有更多控制。

4

在Swift 5中,你可以用一行代码替换掉原本的三行。

KingfisherManager.shared.cache.clearCache()

0

只需使用选项加载:[.forceRefresh]

如果设置,Kingfisher将忽略缓存并尝试启动图像源的下载任务。

self.kf.setImage(with: url, placeholder: placeHolderImage, options: [.forceRefresh])

0

手动从缓存中删除图像

Kingfisher自动管理其缓存。但您仍然可以手动从缓存中删除某个图像:

KingfisherManager.shared.default.cache.removeImage(forKey: cacheKey)

或者,更具控制性:

KingfisherManager.shared.default.cache.removeImage(
    forKey: cacheKey,
    processorIdentifier: processor.identifier,
    fromMemory: false,
    fromDisk: true)
{
    print("Removed!")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接