3

不缓存数据的选项是NSDataReadingUncached.

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

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

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

还进行了以下操作:

[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];

viewDidLoad但是网速还是会跳起来的。我认为通常的建议是,如果需要缓存,则使用NSURLConnection,但由于某种原因,在NSURLConnectionApple 文档的参考资料中,除了提到示例项目之外,根本没有出现“缓存”或“缓存”这个词称为“URLCache”,但根本没有提到缓存。

4

1 回答 1

9

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

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

至于另一种类型的缓存,网络缓存,您没有任何意见使用NSData便捷方法加载 URL 的内容是否使用缓存:它没有。对于这种行为,您必须使用较低级别的 API NSURLConnection,如您所提到的。请注意,为了在此级别利用 HTTP 缓存,您的服务器需要发送正确的标头来指示资源的有效期。否则,将在资源发生变化的悲观假设下提出请求。NSURLConnection在 iOS 上将自动NSURLCache在工作表下使用,再次提供Expires/Cache-Control标头被接收。

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

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

于 2012-08-24T03:33:18.157 回答