如何获取缓存图像 SDWebImage 的数据

Posted

技术标签:

【中文标题】如何获取缓存图像 SDWebImage 的数据【英文标题】:how can I get the data of cached images SDWebImage 【发布时间】:2016-12-28 11:06:45 【问题描述】:

我正在使用 SDWebImage 库在我的 UICollectionView 中缓存 Web 图像:

cell.packItemImage.sd_setImage(with: URL(string: smileImageUrl[indexPath.row]))

但我想将缓存的图像保存在本地文件中,而不是再次下载它们

FileManager.default.createFile(atPath: newPath, contents: Data(contentsOf:  URL(string: snapchildvalue[Constants.smiles.smileImageUrl] as! String)!), attributes: nil)

有没有办法获取缓存图片的数据

【问题讨论】:

【参考方案1】:

SDWebImage 默认自动缓存下载的图片。您可以使用SDImageCache 从缓存中检索图像。当前应用会话有内存缓存,会更快,还有磁盘缓存。用法示例:

if let image = SDImageCache.shared().imageFromDiskCache(forKey: imageURL.absoluteString) 
//use image


if let image = SDImageCache.shared().imageFromMemoryCache(forKey: imageURL.absoluteString) 
//use image

还要确保您的文件中有import SDWebImage。 (如果您使用的是 Swift/Carthage,则为 import WebImage

【讨论】:

【参考方案2】:

SDWebimage 从 url 下载图像后会对其进行处理。基本上,它会根据 url 保存图像,如果图像可用于 URL,则下次保存。它只会从缓存中获取该图像。因此,如果图像已经下载到设备,将立即调用以下方法。

    imgView.sd_setImage(with: URL(string:url), completed:  (image, error, type, url) in
         imgView.image = image
         //Do any thing with image here. This will be called instantly after image is downloaded to cache. E.g. if you want to save image (Which is not required for a simple image fetch, 
         //you can use FileManager.default.createFile(atPath: newPath, contents: UIImagePNGRepresentation(image), attributes: nil)
     )

如果您想将该图像保存在其他地方或修改它或其他任何内容,您可以在上面的完成块中进行。

【讨论】:

什么是imgView 我如何在swift代码中定义它? @Markon UIImageView【参考方案3】:

SDWebImage本地已经有这种缓存文件

    使用您选择的命名空间创建 SDImageCache 尝试使用imageCache.queryDiskCache 获取图像 如果图像存在,将其设置为您的图像视图,如果不存在,使用sd_setImage 获取图像,然后使用SDImageCache.shared().store 将其保存到本地缓存中

key通常是图片的url字符串

类似这样的东西,可能语法不正确:

imageCache.queryDiskCache(forKey: urlForImageString().absoluteString, done: (_ image: UIImage, _ cacheType: SDImageCacheType) -> Void in
    if image 
        self.imageView.image = image
    
    else 
        self.imageView.sd_setImage(withURL: urlForImageString(), placeholderImage: UIImage(named: "placeholder")!, completed: (_ image: UIImage, _ error: Error, _ cacheType: SDImageCacheType, _ imageURL: URL) -> Void in
            SDImageCache.shared().store(image, forKey: urlForImageString().absoluteString)
        )
    
)

【讨论】:

以上是关于如何获取缓存图像 SDWebImage 的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从按钮的 imageView 中删除缓存的 SDWebImage

如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?

如何从 SDWebImage 获取图像大小?

iOS SDWebImage - 如何正确处理不同设备上的视网膜图像?

AFNetworking 与 SDWebimage

缓存图像以供离线使用 SDWebImage