NSURLRequests的默认缓存过期时间是多少?

时间:2012-04-13 09:08:21

标签: objective-c ios http caching nsurlrequest

我正在使用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。:我的应用程序的新版本设置了一个明确的缓存策略,因此这不再是一个问题,但我很好奇默认行为是什么。

3 个答案:

答案 0 :(得分:15)

注意:here详细说明了这应该如何运作

  1. 如果没有缓存,则获取数据。

  2. 如果有缓存,请检查加载方案

    一个。如果指定了重新验证,请检查源更改

    湾如果未指定重新验证,则按照3)

  3. 从本地缓存中获取
  4. 如果未指定重新验证,则会检查本地缓存以查看它是否足够新。

    一个。如果缓存不是陈旧的,那么它会从缓存中提取数据

    湾如果数据是陈旧的,那么它将从源

  5. 重新验证

    来自here

      

    NSURLRequest实例的默认缓存策略是NSURLRequestUseProtocolCachePolicy。 NSURLRequestUseProtocolCachePolicy行为是特定于协议的,并且被定义为协议的最佳符合策略

    来自here

      

    如果请求不存在NSCachedURLResponse,则从中获取数据   起源。如果请求的缓存响应,则加载URL   系统检查响应以确定它是否指定内容必须   重新验证。如果必须重新验证内容,则与原始连接建立连接   来源,看它是否已经改变。如果它没有改变,则返回响应   来自本地缓存。如果已更改,则从原始源获取数据。

         

    如果缓存的响应未指定必须重新验证内容,则为最大值   检查响应中指定的年龄或到期时间。如果缓存的响应是最近的   够了,然后从本地缓存返回响应。如果确定了响应   为了陈旧,检查原始来源是否有更新的数据。如果是更新的数据   可用,数据从原始源获取,否则从中返回   缓存。

    列出的其他选项here

答案 1 :(得分:0)

根据这篇文章:http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html,如果您使用NSURLRequestUseProtocolCachePolicy且服务器未返回expiration或max-age,则默认缓存时间间隔为6-24小时。所以要小心这个条件。使用NSURLRequestUseProtocolCachePolicy时,最好设置max-age或expiration。

答案 2 :(得分:0)

我重新启动应用后,它曾经做过一个新的请求。通过重新启动,我按两次主页按钮,显示正在运行的应用程序列表,杀死我的应用程序并通过单击应用程序图标重新开始。

如果您愿意,也可以禁用缓存。覆盖NSURLProtocol委托的这种方法

//禁用缓存,因为我们的文件存储在多个服务器中,而错误的响应缓存可能会导致问题。

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection
                 willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    NSCachedURLResponse *newCachedResponse = cachedResponse;

    //if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) 
    {
        newCachedResponse = nil;
    } 
    return newCachedResponse;
}