我有一个UITableView,其单元格包含从Internet异步加载图像的自定义ImageView。要加载这些图像我使用NSURLRequest和NSURLConnection工作正常。唯一的问题是图像不会被缓存,因此每次使用时都会下载。我试图将NSURLRequest的cachePolicy设置为“NSURLRequestReturnCacheDataElseLoad”,但没有效果。
从link的最后一个答案看来,iPhone上的NSURLRequest不支持磁盘缓存。这是对的吗?
如果它确实有用,我有兴趣知道在我的情况下它不起作用的原因是什么。
以下是代码:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
答案 0 :(得分:3)
我认为它应该有效。如果没有,则可能意味着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
这是您的一个图片作为标题返回的内容。我没有看到Expires
或Cache-Control
标头,因此这可能就是为什么它们不会被缓存的原因。我认为就WebKit而言,这是每次都应该重新加载的动态内容。
答案 1 :(得分:0)
NSURLCache
磁盘缓存已经起作用。默认情况下NSURLCache
不使用磁盘缓存,您必须自己启用它:
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) diskCapacity:(1024*1024*1024 * 100) diskPath@"Cache.db"];
[NSURLCache setSharedURLCache:cache];
这将设置用于URL加载系统的全局URL缓存。在大多数情况下,这将是"只是工作"。如果您的请求使用NSURLRequestUseProtocolCachePolicy
(默认值),则URL加载系统将使用远程服务器响应指示的生命周期进行缓存。 REDbot等服务可以告诉您给定响应的缓存生命周期是什么。
NSURLSessionConfiguration
可以配置为使用单独的缓存,但实际上这并不像记录的那样工作。从iOS 8开始,如果配置了多个NSURLCache
,则实际上只会使用第一个NSURLCache
。
在使用diskCapacity
的磁盘存储上使用时,还有其他未记录的行为:
- 如果currentDiskUsage
设置为小于5MB,则不会使用它。
- 清除缓存和调整缓存大小通常不会按预期工作。其中一些是在iOS 8中修复的,有些则不是。
- NSURLCache
信息通常不正确。
- 在某些iOS版本diskCapacity
上忽略了NSURLCache
设置的限制,并且无限制地增加了磁盘缓存。
那就是说,NSURLSession
磁盘缓存通常会做正确的事情。如果您在应用程序启动时创建如上所述的磁盘缓存,则缓存将保留对磁盘的响应,并且URL加载系统将使用这些缓存的响应。如上所述设置缓存后,您无需直接与缓存交互 - URL加载系统会为您执行此操作。例外是{{1}},其中缓存似乎仍然有点破碎。