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

时间:2016-12-28 11:06:45

标签: ios swift sdwebimage

我正在使用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)

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

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:2)

从网址下载后,SDWebimage会对图片进行处理。基本上它会将图像保存在网址上,如果图像可用于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)
     })

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

答案 2 :(得分:1)

SDWebImage已在本地拥有此类缓存文件

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

    键通常是图片网址字符串

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

    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)
            })
        }
    })