8

我正在使用 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

PS:我的应用程序的新版本设置了明确的缓存策略,因此这不再是问题,但我很好奇默认行为是什么。

4

3 回答 3

15

注意:这里详细说明了它应该如何工作

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

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

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

    湾。如果未指定重新验证,则按照 3)从本地缓存中获取)

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

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

    湾。如果数据过时,则从源重新验证

这里

NSURLRequest 实例的默认缓存策略是 NSURLRequestUseProtocolCachePolicy。NSURLRequestUseProtocolCachePolicy 行为是特定于协议的,被定义为协议的最佳一致性策略

这里

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

如果缓存的响应未指定必须重新验证内容,则检查响应中指定的最长期限或过期时间。如果缓存的响应足够新,则从本地缓存返回响应。如果确定响应是陈旧的,则检查原始源是否有更新的数据。如果有更新的数据可用,则从原始源获取数据,否则从缓存中返回。

此处列出的其他选项。

于 2012-04-16T12:54:47.347 回答
0

根据这篇文章:http ://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html ,如果您使用的是 NSURLRequestUseProtocolCachePolicy 并且服务器不返回过期或 max-age,则默认缓存时间间隔是 6 - 24 小时。所以要小心这种情况。使用 NSURLRequestUseProtocolCachePolicy 时设置 max-age 或 expire 是更好的做法。

于 2014-04-22T08:47:18.167 回答
0

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

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

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

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

    //if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) 
    {
        newCachedResponse = nil;
    } 
    return newCachedResponse;
}
于 2012-04-13T10:25:03.690 回答