首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AlamofireImage磁盘缓存不工作

AlamofireImage磁盘缓存不工作
EN

Stack Overflow用户
提问于 2016-10-27 10:52:48
回答 2查看 2.4K关注 0票数 8

我希望使用AlamofireImage从url下载图像,然后将其缓存在设备磁盘空间中。我阅读了有关这方面的几篇文章,发现AlamofireImage在ImageDownloader类的帮助下支持这一点。最有趣的信息是给在这个答案中

因此,我尝试为NSURLCache设置一个自定义ImageDownloader,这样它就可以直接将图像缓存到磁盘上。为此,我将内存容量设置为0。然后我使用这个定制的ImageDownloader下载一个图像。我为磁盘路径指定的文件夹是在磁盘上创建的,但不幸的是,它仍然是空的,映像没有以任何方式被缓存。

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

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

代码语言:javascript
复制
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
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-27 13:07:05

为了达到您的目标,您可以使用NSURLCache作为diskCache来为存储的图像设置您自己的过期日期:

代码语言:javascript
复制
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)
    }
}

而不是每次您可以重用共享实例来调用downloadImage方法:UIImageView.af_sharedImageDownloader.downloadImage(URLRequest: request)时创建一个新的UIImageView.af_sharedImageDownloader.downloadImage(URLRequest: request)

票数 4
EN

Stack Overflow用户

发布于 2016-12-16 09:41:01

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

SWIFT3.0

代码语言:javascript
复制
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)
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40282760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档