【问题标题】:On iOS, since dataWithContentsOfURL:options:error: has an option to not cache data, does that mean dataWithContentsOfURL caches data?在 iOS 上,由于 dataWithContentsOfURL:options:error: 具有不缓存数据的选项,这是否意味着 dataWithContentsOfURL 缓存数据?
【发布时间】:2012-08-19 14:44:09
【问题描述】:

不缓存数据的选项是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”的示例项目,但根本没有提到缓存。

【问题讨论】:

    标签: ios caching nsurlconnection nsdata


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2019-08-24
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多