不缓存数据的选项是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”的示例项目,但根本没有提到缓存。
答案 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服务器告诉您的内容。