ios - 在 iOS 上,由于 dataWithContentsOfURL :options:error: has an option to not cache data, 这是否意味着 dataWithContentsOfURL 缓存数据?

标签 ios caching nsurlconnection nsdata

不缓存数据的选项是 NSDataReadingUncached

但是如果我使用 dataWithContentsOfURLUITableViewCell 中的 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/

相关文章:

iphone - 如何在 iOS 视网膜和非视网膜屏幕底部放置 admob 横幅

http - Cache-Control 是 :must-revalidate obliging to validate all requests, 还是陈旧的?

java - Spring + Hibernate Web 应用程序 - 何时使用缓存?

iphone - 什么时候使用哪个? NSURLConnection 与较低级别的套接字 API

ios - CloudKit 推送通知 didReceiveRemoteNotification 从未调用过

ios - SQLite 与 Plist 性能对比

ios - 使用用户的用户名和密码访问 google api

c# - 使用 Rx 缓存来自 Web 服务的结果并在 C# UWP 应用程序中本地使用

ios - Swift 的 AFNetwork

objective-c - 等待 NSURLConnection