2016-05-04 15 views
7

ダウンロードしたイメージをキャッシュするのにAlamofireImageライブラリを使用しています。Alamofireイメージにディスクキャッシュされたイメージを使用する場合

コード:

import UIKit 
import AlamofireImage 

class ViewController: UIViewController { 

    @IBOutlet weak var firstImageView: UIImageView! 
    @IBOutlet weak var secondImageView: UIImageView! 

    let downloader = ImageDownloader() 
    let URLRequest = NSURLRequest(URL: NSURL(string: "https://httpbin.org/image/jpeg")!) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     requestFirstImage() 
    } 

    func requestFirstImage() { 
     downloader.downloadImage(URLRequest: URLRequest) { response in 
      print(response.request) 
      print(response.response) 
      debugPrint(response.result) 
      if let image = response.result.value { 
       self.firstImageView.image = image 
       self.requestSecondImage() 
      } 
     } 
    } 

    func requestSecondImage() { 
     downloader.downloadImage(URLRequest: URLRequest) { response in 
      print(response.request) 
      print(response.response) 
      debugPrint(response.result) 
      if let image = response.result.value { 
       self.secondImageView.image = image 
      } 
     } 
    } 
} 

ログ:ログとして

enter image description here

は、第1の画像が要求されることを示す2つ目は、キャッシュからフェッチされます。余分な要求はなく、画像は即座に表示されます。

私は、最初の画像であってもキャッシュからフェッチされたものの、Logのままであってもアプリを再起動すると思います。私はLibrary/Caches/.../fsCachedDataを見て、そこに画像があり、取り出せる状態になっています。

質問: ここでは何が欠けていますか?最初のイメージが後続の要求でディスクキャッシュから取得される必要があります。

+0

はあなたが正しく、サーバー上のキャッシュ制御ヘッダーを設定しましたか? – Curmudgeonlybumbly

+0

キャッシュコントロールヘッダーが解決されていない場合でも、ローカルに保存されたイメージを取得します。私の理解が正しい場合、私はオフラインで保存されたイメージを取得する必要があります。ここでは該当しません –

+0

次に、AutoPurgingImageCacheを明示的に使用する必要があります。 AlamoFireImageのホームページにあるReadmeの例を参照してください。 – Curmudgeonlybumbly

答えて

10

このアプローチでは、キャッシュ制御の最大経過時間と空き容量があるため、ディスク上にイメージ要求を長く保存します。独自の最大年齢を設定する場合はcustomNSURLCachediskCacheと設定して、の方法で変更したcachedResponseを返す必要があります。ちなみに、メモリキャッシュはImageDownloaderAutoPurgingImageCacheによって処理されます。 @のkishorer747ため08/09/16に更新

func diskImageDownloader(diskSpaceMB: Int = 150) -> ImageDownloader { 

     let diskCapacity = diskSpaceMB * 1024 * 1024 
     let diskCache = NSURLCache(memoryCapacity: 0, diskCapacity: diskCapacity, diskPath: "image_disk_cache") 
     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
     configuration.URLCache = diskCache 
     let downloader = ImageDownloader(configuration: configuration) 
     UIImageView.af_sharedImageDownloader = downloader 
     return downloader 
    } 

: はこの方法であなたのdownloaderを設定し、私は画像要求応答が保存されないようにするため

NSURLCachememoryCapacityはゼロですメモリを節約するためにキャッシュに保存します。メモリ内のAutoPurgingImageCacheによって要求URLのキーとして保存される画像のみが必要です。画像メモリキャッシュのため、ご希望のcacheCapacitycachePurgeCapacityを設定するために以下のようにあなたは私の例の方法を変更することができます。

let cacheCapacity = 100 * 1024 * 1024 
let cachePurgeCapacity = 60 * 1024 * 1024 
let imageCache: ImageRequestCache = AutoPurgingImageCache(memoryCapacity: cacheCapacity, preferredMemoryUsageAfterPurge: cachePurgeCapacity) 
let downloader = ImageDownloader(configuration: configuration, imageCache: imageCache) 
+0

なぜmemoryCapacityは0ですか?これはメモリ内のイメージをキャッシュしていないことを意味しますか?私はしたい場合、0の代わりに任意のサイズを指定できますか? – kishorer747

+0

@ kishorer747イメージメモリのキャッシュをどのように扱うかを示すために私の答えを更新しました。 – FBente

+0

私は20 MBのディスクキャッシュを設定するあなたの答えに従った。それは完全に動作します。しかし、キャッシュがいっぱいになるとどうなりますか?私はまだこのダウンローダの権利を使用して画像をダウンロードすることができますか? 20MBの制限に達したため、最近の画像が古い画像に置き換えられるようになっていますか? – kishorer747

関連する問題