2012-04-13 65 views
7

我正在使用NSURLRequest来检查可用的数据更新。今天我注意到,NSURLRequest默认缓存了请求。即使几个小时后,也没有新的请求发送到服务器。现在我想知道这个缓存的默认行为是什么。缓存的数据何时将陈旧,并且新的请求会发送到服务器? 的数据是一个静态文件和服务器不发送明确的缓存控制标题:什么是NSURLRequests的默认缓存过期时间?

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

回答

0

它用于在重新启动我的应用程序后执行新的请求。通过重新启动,我可以通过按主页按钮两次来显示正在运行的应用程序列表,然后杀死我的应用程序,然后通过单击应用程序图标再次重新开始。

也可以禁用缓存,如果你想。重写NSURLProtocol委托的这种方法

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

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

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

我知道如何解决这个问题。我提到过,我在我的应用程序的新版本中设置了一个明确的缓存策略。所以,实际的问题就解决了。我只是对默认行为感到好奇。 – henrik 2012-04-13 10:38:19

+0

很酷..我的答案也是一个FYI :) – Naresh 2012-04-13 10:39:30

+0

我刚刚回答我的回调,如果我看我的日志applicationWIllTerminate被调用,每当我从多任务列表中删除,这就是为什么我相信它为应用程序开发人员这是你需要处理应用程序退出代码。我想表明,一旦应用程序在这个 – Naresh 2012-04-16 13:14:30

13

注:here规定应如何详细

  1. 工作如果有则没有高速缓存获取数据。

  2. 如果有高速缓存,然后检查加载方案

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

    b。如果没有指定重新验证,则按照3)从本地高速缓存中获取,如3)

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

    a。如果高速缓存未陈旧,则它从高速缓存中提取数据。

    b。如果数据是陈旧然后重新验证来自源

here

一个的NSURLRequest例如默认的缓存策略NSURLRequestUseProtocolCachePolicy。所述NSURLRequestUseProtocolCachePolicy行为是特定的协议,并且被定义为用于协议

here最好贴合策略:

如果NSCachedURLResponse不会为请求存在,则该数据是从 取出原始来源。如果请求存在缓存的响应,则加载 的URL会检查响应,以确定它是否指定重新验证内容必须是 。如果必须重新验证内容,则与原始源 进行连接以查看它是否已更改。如果它没有改变,那么响应从本地缓存返回 。如果它发生了变化,则从原始源获取数据。

如果缓存的响应未指定内容必须重新生效,则会检查响应中指定的最大年龄或到期日期。如果缓存的响应是最近的 ,那么响应将从本地缓存中返回。如果确定响应 陈旧,则检查始发源以获取更新的数据。如果更新的数据是 可用,则从源发送源获取数据,否则从缓存中返回 。

列出的其他选项here

+1

后新鲜启动缓存得到刷新感谢您的答案。我已阅读文档。它指出,“行为是特定于协议的”。现在,如果现在显式的过期时间是由服务器设置的,并且客户端没有配置特定的行为,那么NSUrlRequest会在哪个时间从缓存中驱逐项目? – henrik 2012-04-16 12:59:20

+0

@henrik回答更详细的信息 – mydogisbox 2012-04-16 13:12:51

+0

据我所知,NSUrlCache没有时间限制。时间限制由请求协议设置。如果该协议没有指定一个,那么可能没有一个。 – mydogisbox 2012-04-16 13:56:03

0

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

+0

目前使用NSURLRequestUseProtocolCachePolicy不会自动表示将缓存某些内容,我刚才尝试了一下。 – David 2017-02-09 15:11:53

相关问题