AlamofireImage磁盘caching不工作

我想使用AlamofireImage从url下载图像,然后将其caching在设备磁盘空间中。 我读了几篇文章,发现AlamofireImage在ImageDownloader类的帮助下支持这个。 在这个答案中给出了最有意思的信息

所以我试图为ImageDownloader设置一个自定义的NSURLCache,以便它将图像直接caching到磁盘。 我通过设置内存容量为0.然后我使用这个自定义的ImageDownloader来下载一个图像。 我为磁盘path指定的文件夹是在磁盘上创build的,但不幸的是它保持为空,并且图像没有以任何方式被caching。

**编辑:**重要的是要注意,caching的响应不保存在caching目录中的文件夹中,而是保存在文件夹旁边的数据库文件中。

有人能告诉我我在这里做错了吗? 非常感谢您的阅读!

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

为了达到您的目标,您将使用您的NSURLCache NSURLCache真正自定义为存储的图像设置您自己的到期date:

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

而不是每次重新创build一个新的ImageDownloader来调用downloadImage方法:

我不是这样做的代表。 只是为了节省你的时间与编译器。

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