【问题标题】:NSURLCache cachedResponseForRequest doesn't retrieve cached dataNSURLCache cachedResponseForRequest 不检索缓存数据
【发布时间】:2014-01-28 04:35:27
【问题描述】:

我正在尝试从 NSURLCache 获取之前缓存的信息。使用此代码:

NSString *theCompleteURL = @"http://192.168.1.2:8080/api/endpoint.json";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:theCompleteURL]];

NSCachedURLResponse *response = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if (response) {
    NSLog(@"Cached data found");
}
else {
    NSLog(@"Cached data not found");
}

但我总是得到 nil 作为方法 cachedResponseForRequest 中“响应”变量的响应。

我确信数据在缓存中,因为我在我的应用程序的 Cache.db 文件中检查了它,从 cfurl_cache_response 表中得到了这个结果:

sqlite> select * from cfurl_cache_response;
1|0|1875686237|0|http://192.168.1.2:8080/api/endpoint.json|2014-01-09 11:55:17|
sqlite> 

在 ApplicationDelegate 中,NSURLCache 配置为:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:5 * 1024 * 1024
                                                  diskCapacity:40 * 1024 * 1024
                                                      diskPath:nil];

[NSURLCache setSharedURLCache:cache];

你知道缓存会发生什么吗?

我的端点的标头如下所示:

$ curl -I http://192.168.1.2:8080/api/endpoint.json
HTTP/1.1 200 OK
Content-Length: 1385
Expires:  Thu, 01 Dec 2020 16
00: 00 GMT
Content-Type: application/json;charset=utf-8
ETag:  "3e86-410-3596fbbc"
Cache-Control:  max-age=3600
Connection: keep-alive
Server: thin 1.5.1 codename Straight Razor
$ 

【问题讨论】:

  • 请发布响应标题。请贴出数据应该放在缓存中的代码
  • 编辑添加标题
  • 你能在哪里解决这个问题?
  • 在 iOS 模拟器中重置内容和设置为我解决了这个问题。

标签: ios caching networking nsurlcache


【解决方案1】:

这可以通过与响应关联的标头来解释,特别是 Cache-controlEtag 字段。另见here

13.1.3 缓存控制机制

HTTP/1.1 中的基本缓存机制(服务器指定的过期时间和验证器)是对缓存的隐式指令。在某些情况下,服务器或客户端可能需要向 HTTP 缓存提供显式指令。为此,我们使用 Cache-Control 标头。

Cache-Control 标头允许客户端或服务器在请求或响应中传输各种指令。这些指令通常会覆盖默认缓存算法。作为一般规则,如果标头值之间存在任何明显的冲突,则应用最严格的解释(即最有可能保持语义透明性的解释)。

13.3.2 实体标签缓存验证器

ETag 响应头字段值,一个实体标签,提供一个“不透明”的缓存验证器。这可能允许在不方便存储修改日期、HTTP 日期值的一秒分辨率不够或源服务器希望避免使用修改日期可能引起的某些悖论的情况下进行更可靠的验证.

您可以找到here Cache-control 的允许值和here Etag 的允许值。

【讨论】:

  • 我将标题添加到原始问题中。阅读这些链接后,它们显然是正确的。我正在使用 Etag 和 max-age=3600,也尝试使用 Cache-control 等于 max-age=3600,public,结果完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2020-06-08
  • 2013-10-28
相关资源
最近更新 更多