不缓存数据的选项是 NSDataReadingUncached
。
但是如果我使用 dataWithContentsOfURL
从 UITableViewCell
中的 URL 更新图像(每个单元格一个图像),然后我查看 Mac 上的事件监视器模拟器(运行为iOS 5.1模拟器),然后当我连续上下滚动表格时,网络流量跃升至12kb/s的接收速率。当我停止上下滚动时,网络事件下降到大约 2kb/s 的接收速率或更低。这些图像非常小,每个大约 20kb,当我上下滚动时,我只会让 1 或 2 个图像消失/出现,所以缓存(如果有的话)根本不需要很大。
所以它看起来像 dataWithContentsOfURL
不缓存数据,即使我使用 dataWithContentsOfURL:options:error:
选项为 0
这意味着没有选择,网络事件仍然跳到大约 12kb/s。
那么dataWithContentsOfURL
是否缓存数据,如果没有,为什么dataWithContentsOfURL:options:error:
有不缓存数据的选项?
还做了以下事情:
[[NSURLCache sharedURLCache] setMemoryCapacity:1024*1024*10];
在viewDidLoad
但是网络速率还是会跳起来。我认为通常的建议是,如果需要缓存,则使用 NSURLConnection
,但出于某种原因,在 Apple 文档的 NSURLConnection
引用中,“缓存”或“缓存”根本没有出现,只是提到了一个名为“URLCache”的示例项目,但根本没有提到缓存。
最佳答案
我们在这里讨论两种不同的缓存,文件系统缓存和网络缓存。
您可以传递给 dataWithContentsOfURL:options:error:
的标志 (NSDataReadingUncached
) 指的是前者。提示您正在读取的数据只会被读取一次,因此不需要在缓存中逗留。您可能会惊讶地发现这里涉及文件系统缓存,因为我们正在从 URL 读取,但请记住,该 URL 可能是一个文件 URL,在这种情况下,读取是从磁盘发生的,而不是生成一个网络请求。
至于另一种类型的缓存,网络缓存,您无法决定使用 NSData
便捷方法加载 URL 的内容是否使用缓存:它不.对于这种行为,您必须使用较低级别的 API,如您提到的 NSURLConnection
。请注意,为了在此级别利用 HTTP 缓存,您的服务器需要发送正确的 header 以指示资源的有效期。否则,请求将在资源已更改的悲观假设下进行。 iOS 上的 NSURLConnection
将自动在工作表下使用 NSURLCache
,前提是收到 Expires
/Cache-Control
header .
旁注:当使用 NSURLConnection
时,您不是在连接上设置缓存策略,而是在您用来对连接发出请求的 NSURLRequest
对象上设置缓存策略。因此,您需要查看 NSURLRequest
的引用资料及其同类产品以了解详细信息。
如果以上都不适合你,你可以滚自己的缓存方案,或者从NSURLCache
入手,直接使用。从 iOS 5 开始,NSURLCache
开始使用磁盘缓存并支持 diskCapacity
属性,使其比以前更加强大。如果您对资源将保持新鲜多长时间有某种带外知识,并且超出 HTTP 服务器告诉您的范围,那么这是正确的方法。
关于ios - 在 iOS 上,由于 dataWithContentsOfURL :options:error: has an option to not cache data, 这是否意味着 dataWithContentsOfURL 缓存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102557/