在iOS上,由于dataWithContentsOfURL:options:error:具有不缓存数据的选项,这是否意味着dataWithContentsOfURL会缓存数据?

在iOS上,由于dataWithContentsOfURL:options:error:具有不缓存数据的选项,这是否意味着dataWithContentsOfURL会缓存数据?,ios,caching,nsurlconnection,nsdata,Ios,Caching,Nsurlconnection,Nsdata,不缓存数据的选项为nsdatareadingucached 但是,如果我使用dataWithContentsOfURL更新UITableViewCell中URL的图像(每个单元格一个图像),并查看Mac上用于模拟器的活动监视器(作为iOS 5.1模拟器运行),则当我连续上下滚动表格时,网络流量会跳到12kb/s的接收速率。当我停止上下滚动时,网络活动的接收速率下降到2kb/s或更低。这些图像非常小,大约每个20kb,当我上下滚动时,我只会使1或2个图像消失/出现,因此缓存(如果有的话)根本不需要

不缓存数据的选项为
nsdatareadingucached

但是,如果我使用
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
,但出于某种原因,在苹果文档上的
NSURLConnection
参考中,除了提到一个名为“URLCache”的示例项目外,“缓存”或“缓存”一词根本没有出现,但是根本没有提到缓存。

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

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

至于另一种类型的缓存,即网络缓存,您无法决定使用
NSData
便利方法加载URL内容是否使用缓存:它不会。对于这种行为,您必须使用较低级别的API,如您所提到的
NSURLConnection
。请注意,为了利用此级别的HTTP缓存,服务器需要发送适当的头,指示资源的有效时间。否则,将在资源已更改的悲观假设下发出请求NSURLConnection将自动使用工作表下的
NSURLCache
,前提是收到
Expires
/
缓存控制

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

如果以上任何一项都不适合您,您可以使用自己的缓存方案,或者从
NSURLCache
开始直接使用它。从iOS 5开始,
NSURLCache
开始使用磁盘缓存并尊重
diskCapacity
属性,使其比以前更强大。如果您对资源保持新鲜的时间有一些带外知识,这是正确的方法,超出了HTTP服务器告诉您的范围