我正在使用NSURLRequest来检查可用的数据更新。今天我注意到,NSURLRequest默认缓存了请求。即使在几个小时之后,也没有向服务器发送新请求。现在我想知道这个缓存的默认行为是什么。缓存的数据何时过时并且新请求会发送到服务器? 数据是静态文件,服务器不发送显式缓存控制头:
HTTP/1.1 200 OK
Date: Fri, 13 Apr 2012 08:51:13 GMT
Server: Apache
Last-Modified: Thu, 12 Apr 2012 14:02:17 GMT
ETag: "2852a-64-4bd7bcdba2c40"
Accept-Ranges: bytes
Content-Length: 100
Vary: Accept-Encoding,User-Agent
Content-Type: text/plain
P.S。:我的应用程序的新版本设置了一个明确的缓存策略,因此这不再是一个问题,但我很好奇默认行为是什么。
答案 0 :(得分:15)
注意:here详细说明了这应该如何运作
如果没有缓存,则获取数据。
如果有缓存,请检查加载方案
一个。如果指定了重新验证,请检查源更改
湾如果未指定重新验证,则按照3)
如果未指定重新验证,则会检查本地缓存以查看它是否足够新。
一个。如果缓存不是陈旧的,那么它会从缓存中提取数据
湾如果数据是陈旧的,那么它将从源
来自here:
NSURLRequest实例的默认缓存策略是NSURLRequestUseProtocolCachePolicy。 NSURLRequestUseProtocolCachePolicy行为是特定于协议的,并且被定义为协议的最佳符合策略
来自here:
如果请求不存在NSCachedURLResponse,则从中获取数据 起源。如果请求的缓存响应,则加载URL 系统检查响应以确定它是否指定内容必须 重新验证。如果必须重新验证内容,则与原始连接建立连接 来源,看它是否已经改变。如果它没有改变,则返回响应 来自本地缓存。如果已更改,则从原始源获取数据。
如果缓存的响应未指定必须重新验证内容,则为最大值 检查响应中指定的年龄或到期时间。如果缓存的响应是最近的 够了,然后从本地缓存返回响应。如果确定了响应 为了陈旧,检查原始来源是否有更新的数据。如果是更新的数据 可用,数据从原始源获取,否则从中返回 缓存。
列出的其他选项here。
答案 1 :(得分:0)
我重新启动应用后,它曾经做过一个新的请求。通过重新启动,我按两次主页按钮,显示正在运行的应用程序列表,杀死我的应用程序并通过单击应用程序图标重新开始。
如果您愿意,也可以禁用缓存。覆盖NSURLProtocol委托的这种方法
//禁用缓存,因为我们的文件存储在多个服务器中,而错误的响应缓存可能会导致问题。
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
NSCachedURLResponse *newCachedResponse = cachedResponse;
//if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"])
{
newCachedResponse = nil;
}
return newCachedResponse;
}
答案 2 :(得分:0)
根据这篇文章:http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html,如果您使用NSURLRequestUseProtocolCachePolicy且服务器未返回expiration或max-age,则默认缓存时间间隔为6-24小时。所以要小心这个条件。使用NSURLRequestUseProtocolCachePolicy时,最好设置max-age或expiration。