在iOS上,由于dataWithContentsOfURL:options:error:有一个不缓存数据的选项,这是否意味着dataWithContentsOfURL缓存数据?

时间:2012-08-24 02:43:57

标签: ios caching nsurlconnection nsdata

不缓存数据的选项是NSDataReadingUncached

但是,如果我使用dataWithContentsOfURL更新UITableViewCell中的网址图片(每个单元格一个图片),我会在Mac上查看模拟器上的活动监视器(作为iOS 5.1运行)模拟器),当我连续上下滚动表时,网络流量跳跃到12kb / s的接收速率。当我停止上下滚动时,网络活动下降到约2kb / s接收率或更低。那些图像非常小,每个像20kb左右,当我上下滚动时,我只会使1或2个图像消失/出现,所以缓存(如果有的话)根本不需要很大。

所以看起来dataWithContentsOfURL看起来不会缓存数据,即使我使用dataWithContentsOfURL:options:error:选项0表示没有选项,网络活动仍然会跳到大约12kb /秒。

dataWithContentsOfURL缓存数据也是如此,如果没有,为什么dataWithContentsOfURL:options:error:可以选择不缓存数据?

还完成了以下工作:

[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];
viewDidLoad中的

但网络速率仍然会上升。我认为通常的建议是,如果需要缓存,则使用NSURLConnection,但出于某种原因,在Apple的doc的NSURLConnection引用中,“缓存”或“缓存”一词不会出现除了提到一个名为“URLCache”的示例项目,但根本没有提到缓存。

1 个答案:

答案 0 :(得分:9)

我们在这里谈论两个不同的缓存,文件系统缓存和网络缓存。

您可以传递给dataWithContentsOfURL:options:error:NSDataReadingUncached)的旗帜是指前者。它暗示您正在阅读的数据只会被读取一次,因此它不需要在缓存中逗留。您可能会惊讶地发现文件系统缓存在这里完全涉及,因为我们正在从URL读取,但请记住URL可能是文件URL,在这种情况下,读取发生在磁盘而不是生成网络请求。

对于其他类型的缓存,即网络缓存,您是否有任何说法是否使用NSData便捷方法加载URL的内容是否使用缓存:它不会使用缓存。吨。对于该行为,您必须使用像NSURLConnection这样的低级API,如您所述。请注意,为了利用此级别的HTTP缓存,您的服务器需要发送正确的标头,指示资源的有效期。否则,请求将在资源已经改变的悲观假设下进行。如果收到NSURLConnection / NSURLCache标题,iOS上的Expires会自动使用表格下的Cache-Control

旁注:使用NSURLConnection时,不是在连接上设置缓存策略,而是在用于通过连接发出请求的NSURLRequest对象上设置缓存策略。因此,您需要查看NSURLRequest及其同类的参考资料,以了解详细信息。

如果以上都不适合您,您可以滚动自己的缓存方案,或者从NSURLCache开始直接使用它。从iOS 5开始,NSURLCache开始使用磁盘缓存并尊重diskCapacity属性,使其比以前更强大。如果您对资源保持新鲜的时间有一些带外的了解,那么这是正确的方法,超出您的HTTP服务器告诉您的内容。