我希望我的数据总是从服务器中获取,除非没有网络。然后我要返回缓存的数据。因此,无论是否有网络,我的用户总是会得到一些数据(而不是告诉他们:不是网络连接之类的)。那么我应该使用哪个NSURLRequestCachePolicy呢?

最佳答案

“我希望我的数据总是从服务器中获取,除非没有网络。然后,我希望返回缓存的数据。”

缓存策略常量are described here

没有任何缓存策略执行您描述的操作。如果服务器不可用,则可以通过将响应提供到缓存之外来实现自己的缓存逻辑(但是,实际上并不建议这样做)。

您的问题并未描述您是否希望将缓存的响应保存到磁盘。默认情况下,NSURLCache仅缓存内存,您可以创建一个NSURLCache实例来轻松使用磁盘:

  cache = [[NSURLCache alloc] initWithMemoryCapacity:[(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath:@"Cache.db"]:

可以将缓存设置为全局共享URL缓存,也可以将其与NSURLSessionConfiguration一起使用。

当您决定应用程序不应尝试与服务器联系时,可以通过asking it for a cached response for a request直接访问缓存:
cachedResponse = [cache cachedResponseForRequest:request];

缓存的响应是NSCachedURLResponse,其中包含与该请求的响应的缓存表示关联的NSDataNSURLResponse。然后,您可以将那些对象分配给已实现的用于处理服务器响应的任何方法。

就是说,使用默认的NSURLRequestUseProtocolCachePolicy缓存策略几乎总是最佳选择,而不是实现自己的缓存或更改请求的缓存策略。当服务器响应HTTP请求时,响应中包含有关响应将持续多长时间以及在什么条件下有效的信息。例如,响应可能包含这样的标头:
Cache-control: max-age:3600

这是服务器告诉客户端提供的响应在3600秒内有效。 NSURLRequestUseProtocolCachePolicy了解这些值以及在客户端上控制其使用的规则。如果您在那3600秒的时间内从客户端发出相同的请求,则Foundation将为您的应用程序提供缓存的响应,而不是与服务器联系。 “拥有”客户端所请求数据的服务器是唯一可以正确推断响应有效性的一方。

因此,在我们的示例中,假设用户在那3600秒内处于“离线”状态。如果他们发出相同的请求,则应用程序将使用缓存的响应。如果3600秒已过去,则上下文过期且无效。服务器已告知客户端,如果已过去3600秒,则不应使用此响应。如果客户端“脱机”,则客户端将无法联系服务器或使用缓存-这正是您想要的。如果响应是应该“永不”更改的内容,则客户端可以缓存并永久保存,服务器将表明这一点(在这种情况下,可能通过在响应中发送年的最大寿命值)。

10-08 04:47