web-dev-qa-db-ja.com

キャッシュされた画像のデータを取得するにはどうすればよいですか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)

キャッシュされた画像のデータを取得する方法はありますか

8
Tawfik Bouabid

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

20
Kaan Dedeoglu

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

それでも、その画像を別の場所に保存したり、変更したりする場合は、上記の完了ブロックで行うことができます。

3
Saad

SDWebImageはすでにこの種のキャッシュファイルをローカルに持っています

  1. 選択した名前空間でSDImageCacheを作成します
  2. _imageCache.queryDiskCache_で画像を取得してみてください
  3. 画像が存在する場合は、画像ビューに設定します。存在しない場合は、_sd_setImage_を使用して画像を取得し、SDImageCache.shared().storeを使用してローカルキャッシュに保存します。

通常、キーは画像の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)
        })
    }
})
_
1
Tj3n