Alamofire - NSURLCache不工作?

ary*_*axt 8 nsurlcache swift alamofire

我将缓存设置如下

var cacheSizeMemory = 20 * 1024 * 1024
var cacheSizeDisk = 100 * 1024 * 1024
var sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "SOME_PATH")
NSURLCache.setSharedURLCache(sharedCache)
Run Code Online (Sandbox Code Playgroud)

使用缓存策略创建请求

var request = NSMutableURLRequest(URL: NSURL(string: "\(baseUrl!)\(path)")!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: timeout)
Run Code Online (Sandbox Code Playgroud)

提出请求并获得以下回复 Cache-Control private, max-age=60

然后尝试检查缓存

var cachedResponse = NSURLCache.sharedURLCache().cachedResponseForRequest(urlRequest)
Run Code Online (Sandbox Code Playgroud)

价值是零

有什么想法吗?

Fra*_*k R 18

我能够通过将页面写入sharedURLCache来手动缓存页面,如下所示:

    Alamofire.request(req)
        .response {(request, res, data, error) in
            let cachedURLResponse = NSCachedURLResponse(response: res!, data: (data as NSData), userInfo: nil, storagePolicy: .Allowed)
            NSURLCache.sharedURLCache().storeCachedResponse(cachedURLResponse, forRequest: request)
        }
Run Code Online (Sandbox Code Playgroud)

NSURLCache似乎尊重服务器发送的标头,即使您在代码中的其他地方配置了相反的内容.

例如,维基百科API发送

Cache-control: private, must-revalidate, max-age=0
Run Code Online (Sandbox Code Playgroud)

转换为:必须在0秒后重新验证.
所以NSURLCache说:"好的,我不会缓存任何东西."

但是通过手动将响应保存到缓存,它可以正常工作.至少在iOS 8.2上.

在这个问题上几乎失去了理智.:)


ary*_*axt 9

我结束了手动添加Cache-Controlprivate我的请求的头,它现在的作品.甚至不需要手动检查缓存,Alamofire会为您完成

let cachePolicy: NSURLRequestCachePolicy = isReachable() ? .ReloadIgnoringLocalCacheData : .ReturnCacheDataElseLoad

var request = NSMutableURLRequest(URL: NSURL(string: "\(baseUrl!)\(path)")!, cachePolicy: cachePolicy, timeoutInterval: timeout)

request.addValue("private", forHTTPHeaderField: "Cache-Control")

var alamoRequest = Manager.sharedInstance.request(urlRequest)
Run Code Online (Sandbox Code Playgroud)