5

我有一个 UITableView,其单元格包含从 Internet 异步加载图像的自定义 ImageView。要加载这些图像,我使用 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];
4

2 回答 2

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

这是您的一张图片作为标题返回的内容。我没有看到ExpiresorCache-Control标头,所以这可能是它们没有被缓存的原因。我认为就 WebKit 而言,这是每次都应该重新加载的动态内容。

于 2010-03-01T01:14:50.307 回答
1

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 加载系统将使用远程服务器响应指示的生命周期进行缓存。REDbot等服务可以告诉您给定响应的缓存生命周期。

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

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

也就是说,NSURLCache磁盘缓存通常会做正确的事情。如果您在应用程序启动时如上所述创建磁盘缓存,则缓存会将响应持久保存到磁盘,并且 URL 加载系统将使用这些缓存的响应。如上所述设置缓存后,您无需直接与缓存交互 - URL 加载系统会为您完成。例外是NSURLSession,缓存似乎仍然有点损坏。

于 2014-11-16T20:01:53.610 回答