我希望始终从服务器获取数据,除非没有网络。然后我想要返回缓存的数据。因此,无论是否存在网络,我的用户总是获取一些数据(而不是告诉他们:不是网络连接等)。那么我应该使用哪个NSURLRequestCachePolicy?
答案 0 :(得分:4)
"我希望始终从服务器获取数据,除非没有网络。然后我想要返回缓存的数据。"
缓存策略常量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
,其中包含与该请求的响应的缓存表示相关联的NSData
和NSURLResponse
。然后,您可以将这些对象提供给您为处理服务器响应而实现的任何方法。
也就是说,使用NSURLRequestUseProtocolCachePolicy
的默认缓存策略几乎总是最好的选择,而不是实现自己的缓存或更改请求的缓存策略。当服务器响应HTTP请求时,响应包括有关响应有效的时间长度和条件的信息。例如,响应可能包含如下标题:
Cache-control: max-age:3600
这是服务器告诉客户端提供的响应将持续3600秒。 NSURLRequestUseProtocolCachePolicy
了解这些值以及管理其在客户端上使用的规则。如果您在3600秒期间从客户端发出相同的请求,Foundation将为您的应用程序提供缓存响应,而不是联系服务器。服务器,"拥有"客户端请求的数据是唯一可以正确推理响应有效性的一方。
所以,让我们说用户是"离线"在我们的例子中的3600秒期间。如果他们发出相同的请求,应用程序将使用缓存的响应。如果3600秒的时间段已过,则上下文已过期且无效。服务器告诉客户端,如果超过3600秒,则不应使用此响应。如果客户端是"离线",客户端将无法联系服务器或使用缓存 - 这正是您想要的。如果回应是应该"永远"更改,客户端可以缓存并永久保留,服务器会指示(在这种情况下,可能通过在响应中发送年龄的最大年龄值)。