【问题标题】:Does disk caching with NSURLRequest and NSURLConnection actually work on the iPhone?使用 NSURLRequest 和 NSURLConnection 进行磁盘缓存是否真的可以在 iPhone 上使用?
【发布时间】:2011-01-22 02:38:17
【问题描述】:

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

【问题讨论】:

    标签: iphone caching nsurlconnection disk nsurlrequest


    【解决方案1】:

    我认为它应该有效。如果没有,则可能意味着 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
    

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

    【讨论】:

      【解决方案2】:

      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 开始,如果配置了多个 NSURLCaches,则只会实际使用第一个。

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

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

      【讨论】:

        猜你喜欢
        • 2014-07-03
        • 2012-08-23
        • 2015-02-07
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 2023-04-01
        • 2014-01-23
        • 2014-12-15
        相关资源
        最近更新 更多