5

我正在NSURLCache使用AFNetworking. 缓存工作正常,但无法检查响应是否实际上是从缓存中检索到的。要检查缓存版本是否可用,我使用

[[NSURLCache sharedURLCache] cachedResponseForRequest:_request];

检查我的文件的缓存版本。

我的服务器正在发送以下标头:

Cache-Control:public, must-revalidate, max-age=0
ETag:"317a405bf9f69346c1f0438736a3d02e"

这基本上应该确保缓存的响应在下载后立即过时。但是,cachedResponseForRequest:即使它实际上已过期,仍会在磁盘上加载先前缓存的版本。

  • NSURLCache永不过期还是我没有发送正确的标头等?
  • 我在这里错过了其他东西吗?

编辑

我也试过发送

Expires: "Mon, 27 May 2013 14:34:50 GMT"

标头和响应仍然从缓存中返回,即使它已经过期。我感觉NSURLCache工作不正常...

4

1 回答 1

2

大多数 iOS 网络 API(例如 NSURLConnection)都会自动使用 NSURLCache。您只需要实例化一个 NSURLCache 对象并在发出任何网络请求之前使用 [NSURLCache setSharedURLCache:] 设置它。

即使设置了 max-age=0,如果提供了 ETag,NSURLCache 也必须存储响应,以便它可以发送下一个请求,并将 If-None-Match 请求标头设置为前一个 ETag 值。如果服务器回复 304,则返回缓存的响应。

所以我认为 cachedResponseForRequest: 正在返回缓存的响应,无论它是否实际有效。

您不需要直接获取缓存。这一切都由 iOS 透明地管理。

于 2014-05-22T00:14:46.680 回答