7

我需要释放使用 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()

仍然没有按预期释放内存。如果我遗漏了什么,请纠正我。

4

5 回答 5

17

在收到内存警告时,我清除了缓存,现在对我来说效果很好:

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()
}
于 2017-06-08T10:09:35.583 回答
8

Swift 4 中的 KingFisher

KingfisherManager.shared.cache.clearMemoryCache()
KingfisherManager.shared.cache.clearDiskCache()
KingfisherManager.shared.cache.cleanExpiredDiskCache()
于 2018-09-12T09:58:15.700 回答
4

根据文档

Kingfisher 将在收到内存警告时清除内存缓存,并在需要时清除过期和超出大小的缓存。通常不需要自己清理缓存。如果您希望您的用户对缓存有更多的控制权,则可以使用这些方法。

于 2017-09-09T17:33:16.907 回答
2

Swift 5,你可以用一条替换 3 行。

KingfisherManager.shared.cache.clearCache()
于 2020-12-14T10:08:51.703 回答
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!")
}
于 2020-12-31T13:54:25.303 回答