2016-10-27 9 views
6

URLから画像をダウンロードしてデバイスのディスクスペースにキャッシュするには、AlamofireImageを使用します。私はこれについていくつかの記事を読んで、AlamofireImageがImageDownloaderクラスの助けを借りてこれをサポートしていることを知りました。最も興味深い情報が与えられましたin this SO answerAlamofireImageディスクキャッシュが機能しない

私はImageDownloader用のカスタムNSURLCacheを設定して、画像をディスクに直接キャッシュするようにしました。私はメモリ容量を0に設定しました。次に、このカスタムImageDownloaderを使用してイメージをダウンロードします。ディスクパスに指定したフォルダはディスク上に作成されますが、残念ながら空のままで、イメージは決してキャッシュされません。

**編集**キャッシュされた応答は、キャッシュディレクトリ内のフォルダに保存されず、フォルダの隣のデータベースファイルに保存されます。

誰でも私がここで間違っていることを教えてもらえますか?読んでくれてありがとう!

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

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

    return downloader 
} 

func getProfileImage(atURL url: String, onComplete: SRServiceResponse<UIImage> -> Void) { 
    guard let imageURL = NSURL(string: url) else 
    { 
     // TODO: Fail here 
     return 
    } 

    let request = NSURLRequest(URL: imageURL) 

    let imageDownloader = self.diskImageDownloader() 

    imageDownloader.downloadImage(URLRequest: request) { (response) in 
     switch response.result 
     { 
     case .Success(let image): 
      // Do something 
     case .Failure(let error): 
      // Do something 
     } 
    } 
} 

答えて

4

は、あなたの目標が作る到達するためにあなたのあなたが保存されている画像のために、独自の有効期限を設定するDISKCACHE本当にカスタムとして使用NSURLCache

class DiskCache: NSURLCache { 
    private let constSecondsToKeepOnDisk = 30*24*60*60 // 30 days 

    override func storeCachedResponse(cachedResponse: NSCachedURLResponse, forRequest request: NSURLRequest) { 
     var customCachedResponse = cachedResponse 
     // Set custom Cache-Control for Image-Response 
     if let response = cachedResponse.response as? NSHTTPURLResponse, 
      let contentType = response.allHeaderFields["Content-Type"] as? String, 
      var newHeaders = response.allHeaderFields as? [String: String] where contentType.containsString("image") { 
      newHeaders["Cache-Control"] = "public, max-age=\(constSecondsToKeepOnDisk)" 
      if let url = response.URL, newResponse = NSHTTPURLResponse(URL: url, statusCode: response.statusCode, HTTPVersion: "HTTP/1.1", headerFields: newHeaders) { 
       customCachedResponse = NSCachedURLResponse(response: newResponse, data: cachedResponse.data, userInfo: cachedResponse.userInfo, storagePolicy: cachedResponse.storagePolicy) 
      } 
     } 
     super.storeCachedResponse(customCachedResponse, forRequest: request) 
    } 
} 

を代わりに使用すると、再利用することができ、新たなImageDownloader毎回作成しますdownloadImageメソッドを呼び出す共有インスタンス:UIImageView.af_sharedImageDownloader.downloadImage(URLRequest: request)

+1

おかげで

。実際、私のイメージレスポンスには最大年齢のヘッダーがありませんでした。また、キャッシュされた応答は、キャッシュディレクトリ内のフォルダに保存されず、フォルダの横にあるデータベースファイルに保存されることに注意することも重要です。 –

4

私は担当者のためにこれをやっていません。コンパイラで時間を節約するだけです。あなたの答えのためのスウィフト3.0

class DiskCache: URLCache { 


    private let constSecondsToKeepOnDisk = numDaysToKeep*24*60*60 // numDaysToKeep is your own constant or hard-coded value 

    override func storeCachedResponse(_ cachedResponse: CachedURLResponse, for request: URLRequest) { 

    var customCachedResponse = cachedResponse 
    // Set custom Cache-Control for Image-Response 
    let response = cachedResponse.response as! HTTPURLResponse 

    if let contentType = response.allHeaderFields["Content-Type"] as? String, 
     var newHeaders = response.allHeaderFields as? [String: String], contentType.contains("image") { 
     newHeaders["Cache-Control"] = "public, max-age=\(constSecondsToKeepOnDisk)" 
     if let url = response.url, let newResponse = HTTPURLResponse(url: url, statusCode: response.statusCode, httpVersion: "HTTP/1.1", headerFields: newHeaders) { 
      customCachedResponse = CachedURLResponse(response: newResponse, data: cachedResponse.data, userInfo: cachedResponse.userInfo, storagePolicy: cachedResponse.storagePolicy) 
     } 
    } 
    super.storeCachedResponse(customCachedResponse, for: request) 
    } 
} 
+0

これを使ってUIImageViewに画像を設定するにはどうしたらいいですか? – markhorrocks

+0

umm ... AlamofireImageの手順を使用しますか? :D – horseshoe7

+0

うん、それを試して、それを理解していない。ごめんなさい。 – markhorrocks

関連する問題