【问题标题】:UIWebView doesn't always call -[NSURLCache storeCachedResponse:forRequest:]UIWebView 并不总是调用 -[NSURLCache storeCachedResponse:forRequest:]
【发布时间】:2012-02-20 18:54:02
【问题描述】:

似乎UIWebView 在加载资源时并不总是调用storeCachedResponse:forRequest:。有谁知道为什么?我正在尝试使用-[NSURLCache storeCachedResponse:forRequest:] 来缓存图像,它可以很好地完成大部分工作,但是在某些情况下UIWebView 不会在页面加载时调用此方法,因为它实际上有图像。

【问题讨论】:

  • 我也注意到了这一点;虽然我的应用只有 on 设备。当 Web 视图从 NSURLCache 加载请求时,它似乎跳过了该页面上资产的相同缓存。

标签: iphone objective-c ios ipad uiwebview


【解决方案1】:

如上所述,here NSURLConnection 不会在文件大小超过 50kb(52428 字节)时调用 storeCachedResponse:forRequest:
试试ASIHTTPRequestcaching

【讨论】:

  • 我在小文件(100 字节)中也看到了这一点。 webview也无法调用cachedResponseForRequest:
【解决方案2】:

您是否检查过 HTTP 状态和缓存标头?过期,缓存控制等?也许服务器以 status=304 回答而没有任何响应正文?

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse 
{
  NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode);
  NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields);
}

【讨论】:

    【解决方案3】:

    回答赏金提供者的询问:

    我也在小文件(100 字节)中看到了这种情况。网络视图 也无法调用cachedResponseForRequest:

    我发现this question 直接解决了这种行为:

    尽管有 Apple 的文档 indicating otherwise, iOS 上的NSURLCache 根本不做任何磁盘(闪存)缓存。 你 可以继承NSURLCache 来改变获取的行为和 存储操作以使用磁盘(例如 SDURLCache 确实),但由于 遵循高速缓存的使用和实现方式的严格限制, 这并不像您期望的那样有效:

    • NSURLConnection 甚至不会为超过 50KB (>= 52428) 的文件调用 storeCachedResponse:forRequest: 字节,确切地说)。这使得子类化NSURLCache 对 我们使用(200KB 图像),因为它甚至不会进入缓存。作为一个 结果,我们必须在上一级手动添加缓存 NSURLConnection

    • 即使手动调用 NSURLCache 内置的storeCachedResponse:forRequest:,它也只存储 如果小于约 180KB,则在内存中响应。我测试了这个 手动调用 storeCachedResponse 并看到之前/之后 currentMemoryUsage 对于超过 180KB 的数据长度没有变化。 所以我们也必须编写自己的 LRU 内存缓存。

    (强调我的。)

    这似乎是被调出行为的原因。作为the current accepted answer points outASIHTTPRequest 是此行为的预期解决方法。

    但是,请注意页面顶部的警告:

    请注意,我不再使用此库 - 您可能需要考虑为新项目使用其他东西。 :)

    您应该考虑依赖受支持的库,或者,如果您愿意,可以在此库成为您的代码的基础后回馈该库。

    【讨论】:

    • 欣赏它 :)(这是我应该更加努力搜索的一个很好的例子)-感谢您花时间彻底深入研究!
    • @Nevir 没问题!我很高兴它很有用。 :)
    • 有谁知道 iOS 7/8 上的 NSURLSession 是否仍然如此?我在获取 NSURLCache 以保存大型 (~7MB) 图像文件时遇到问题。
    【解决方案4】:

    我不确定 UIWebviewuw 是如何工作的,但是当您使用 NSURLRequest 时,文件的最大大小取决于您如何初始化 URLCache (initWithMemoryCapacity:(NSUInteger)memoryCapacity ...) 我刚刚缓存了一个 2MB 的文件

    【讨论】:

    • 对我来说,从 UIWebView 请求的 515KB .css 文件可以用 cachedResponseForRequest:NSURLCache 子类的 memoryCapacity:0 diskCapacity:1024*1024*256 初始化来处理
    【解决方案5】:

    NSURLCache 使用两种不同的缓存:磁盘缓存和内存缓存

    • 如果响应大小低于 50kb,则响应将被缓存到内存缓存 和
    • 如果响应大小超过 50kb
    • ,响应将被缓存到磁盘缓存中

    如果你用 diskPath nil 初始化 NSURLCache,那么磁盘缓存将不会被激活,storeCachedResponse:forRequest: 只会在响应大小小于 50kb 时被调用。

    所以像这样配置你的 URLCache

    [[MYCustomURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 
                              diskCapacity:20 * 1024 * 1024 
                              diskPath:@"urlcache.db"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多