I am using Kingfisher
library for downloading and caching images. I am facing some issues in the implementation:
Are the images cached in both memory and disk?
Is there any provision to cache images only on disk?
I have already read multiple posts regarding this, but couldn't find any solution.
Disk Cache will store on your hard drive and will not be deleted when you close the software. You should also note that over time your cache can get quite large and take up a lot of space on your Hard Drive. However, don't worry you can clean things up and purge your system of that used disk space.
A cache is a special storage space for temporary files that makes a device, browser, or app run faster and more efficiently. After opening an app or website for the first time, a cache stashes files, images, and other pertinent data on your device.
swift. Because the landscape table view cell uses Kingfisher to request the landscape's image, the thumbnail image view no longer needs to be exposed.
Swift 5.3, Xcode 12
https://stackoverflow.com/a/44354411/10579134 , the latest version of the following
ImageCache.default.memoryStorage.config.totalCostLimit = 1 //1 in bytes
Yes, Kingfisher caches images both in memory and on disk.
By default, the amount of RAM that will be used is not even limited, you have to set the value yourself:
ImageCache.default.maxMemoryCost = 1024 * 1024 * yourValue
where 1024 * 1024 * yourValue
is the global cost in megapixels (I know this is weird, but it's not megabytes, it's megapixels, because images can have different bit depth, etc).
For example, in my tests, the maximum RAM used with a value of 1024 * 1024 * 500
fluctuates between 120MB and 300MB.
Incidentally, this is also how you tell Kingfisher to never use the RAM and only cache to disk:
ImageCache.default.maxMemoryCost = 1
This will force Kingfisher to only use the disk cache.
How to debug
The first thing is to check that you're setting the max value on the right cache. Maybe you did create a custom cache? My example is setting the value for the default cache, the one used if no other is defined.
You may also want to manually clear the memory cache and compare the RAM occupation before and after:
ImageCache.default.clearMemoryCache()
If you think that some big image is in the memory cache when it shouldn't be, you can verify with isImageCached
:
if let result = ImageCache.default.isImageCached(forKey: imageLink) {
print(result.cached)
print(result.cacheType)
}
If anyone looking for answer for downloading images explicitly and caching the same without using imageView the sample code is:
ImageDownloader.default.downloadImage(with: imgUrl, retrieveImageTask: nil, options: [], progressBlock: nil) { (image, error, url, data) in
print("Downloaded Image: \(url)")
//cache image:
if let image = image, let url = url {
ImageCache.default.store(image, forKey: url.absoluteString)
}
}
reference: https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With