UIWebView并不总是调用 - [NSURLCache storeCachedResponse:forRequest:]

时间:2012-01-27 19:47:31

标签: iphone objective-c ios ipad uiwebview

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

5 个答案:

答案 0 :(得分:11)

回答赏金提供者的查询:

  

我也看到了这个小文件(100个字节)。 webview   也无法拨打cachedResponseForRequest:

我发现this question直接解决了这种问题:

  

尽管有Apple的文档indicating otherwise,   iOS上的NSURLCache根本不执行任何磁盘(闪存)缓存。 您   可以子类NSURLCache来改变fetch和的行为   存储使用磁盘的操作(如   SDURLCache确实如此,但由于   遵循如何使用和实现缓存的严格限制,   这不会像你期望的那样有效:

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

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

  •   

(强调我的。)

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

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

  

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

您应该考虑依赖受支持的库,或者,如果您愿意,一旦它成为您的代码的基础,就会回馈此库。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

如果使用diskPath nil初始化NSURLCache,则磁盘缓存将不会处于活动状态,只有在50kb以下的响应大小时才会调用storeCachedResponse:forRequest:

所以像这样配置你的URLCache

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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