使用NSURLRequest和NSURLConnection的磁盘缓存在iPhone上真的可以工作吗?

使用NSURLRequest和NSURLConnection的磁盘缓存在iPhone上真的可以工作吗?,iphone,caching,nsurlconnection,disk,nsurlrequest,Iphone,Caching,Nsurlconnection,Disk,Nsurlrequest,我有一个UITableView,它的单元格包含自定义的ImageView,可以从internet异步加载图像。要加载这些图像,我使用NSURLRequest和NSURLConnection,这两种方法都很好。唯一的问题是图像没有被缓存,因此每次使用时都会被下载。我尝试将NSURLRequest的cachePolicy设置为“NSURLRequestReturnCacheDataElseLoad”,但没有效果 从上一个答案来看,iPhone上的NSURLRequest不支持磁盘缓存。这是正确的吗

我有一个UITableView,它的单元格包含自定义的ImageView,可以从internet异步加载图像。要加载这些图像,我使用NSURLRequest和NSURLConnection,这两种方法都很好。唯一的问题是图像没有被缓存,因此每次使用时都会被下载。我尝试将NSURLRequest的cachePolicy设置为“NSURLRequestReturnCacheDataElseLoad”,但没有效果

从上一个答案来看,iPhone上的NSURLRequest不支持磁盘缓存。这是正确的吗

如果它真的有效,我很想知道在我的情况下它不起作用的原因是什么

代码如下:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];


connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

我认为应该行得通。如果没有,则可能意味着web服务器实际上正在提供不可缓存的内容。例如,因为它没有设置正确的标题

如果你可以发布一个链接到其中一张图片,那么我们可以仔细看看

HTTP/1.1 200 OK
Date: Mon, 01 Mar 2010 12:40:46 GMT
Server: Apache
Last-Modified: Mon, 01 Mar 2010 09:33:29 GMT
ETag: "25e8dd2-11a6-480b9f1178c40"
Accept-Ranges: bytes
Content-Length: 4518
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/png

这是其中一个图像作为标题返回的内容。我看不到
过期
缓存控制
头,所以这可能是它们未被缓存的原因。我认为就WebKit而言,这是一种动态内容,每次都应该重新加载。

NSURLCache
自iOS 5以来,磁盘缓存一直在工作。默认情况下,
NSURLCache
不使用磁盘缓存,您必须自己启用它:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath@"Cache.db"];
[NSURLCache setSharedURLCache:cache];
这将设置用于URL加载系统的全局URL缓存。在大多数情况下,这将“起作用”。如果您的请求使用默认的
NSURLRequestUseProtocolCachePolicy
,则URL加载系统将使用远程服务器响应指示的生存期进行缓存。诸如的服务可以告诉您给定响应的缓存生存期

NSURLSessionConfiguration
可以配置为使用单独的缓存,但是在实践中,这并不像文档中所描述的那样有效。从iOS 8开始,如果配置了多个
NSURLCache
s,则只会实际使用第一个

将磁盘存储与
NSURLCache
一起使用时,还有其他未记录的行为: -如果
diskCapacity
设置为小于5MB,则不会使用它。 -清除和调整缓存的大小通常无法按预期工作。有些问题在iOS 8中得到了修复,有些则没有。 -
currentDiskUsage
信息通常不正确。 -在某些iOS版本上,
NSURLCache
忽略由
diskCapacity
设置的限制,并无限制地增加磁盘缓存

也就是说,
NSURLCache
on disk caching通常做正确的事情。如果在应用程序启动时如上所述创建磁盘上缓存,缓存将保留对磁盘的响应,URL加载系统将使用这些缓存响应。一旦您按照上面的方式设置了缓存,您就不需要直接与缓存交互——URL加载系统会为您这样做。例外情况是
NSURLSession
,缓存似乎仍然有点中断