我在使用 NSURLCache 时看到了奇怪的行为,并用尽了所有选项但在这里发布......所以这里是:
我正在尝试将 NSURLCache
与 NSURLSession
结合使用作为底层缓存机制。使用 Charles 和简单的 println()
我观察到无论我做什么,我的应用程序都会继续返回服务器并重新请求以前的请求。
我验证了我的服务器一致地发送以下 header :
Cache-Control:public, max-age=31449600
Content-Length:74289
Content-Type:image/jpeg
ETag:"abcdf"
Expires:Sun, 03 Jan 2016 20:58:01 GMT
Last-Modified:Sat, 09 Nov 2013 08:05:53 GMT
然而,当我提出以下要求时:
let req = NSURLRequest(URL: NSURL(string: URLString)!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: 15)
NSURLSession
的 willCacheResponse:
委托(delegate)方法根本没有被调用:
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, willCacheResponse proposedResponse: NSCachedURLResponse, completionHandler: (NSCachedURLResponse!) -> Void) {
但是,当简单地请求 NSURLRequest(URL: NSURL(string: URLString)!)
而不指定特定的 cachePolicy
时,然后 willCacheResponse:
确实被调用了。尽管如此,下次发出相同请求时,应用程序会返回到服务器...
我没有在任何 NSURLSession 委托(delegate)方法中做任何响应对象修改,我的请求都是 HTTP GET
。
我错过了什么?
我已经阅读了很多关于 NSURLCache 的内容:
- https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html
- http://nshipster.com/nsurlcache/
- http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/
- NSURLCache doesn't cache
- 各种其他 SO 线程...
设置:Xcode6.1、Swift、iOS8+
编辑: 我将一个基本示例推送到 github 以显示我的问题:https://github.com/opfeffer/nsurlcache
检查一下,让我知道我做错了什么!
最佳答案
我看到你的 GET 请求有参数,为此我认为我们面临着同样的情况。
我找到了一个覆盖 NSURLCache 的解决方案,做了一些调整并访问了底层数据库,你可以在这里看到它:
https://github.com/JCardenete/NTURLCache/tree/master/NTURLCache
NSURLCache - Disk caching for GET request with parameters not working
关于ios - NSURLSession 的 NSURLCache 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770350/