繁体   English   中英

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

[英]UIWebView doesn't always call -[NSURLCache storeCachedResponse:forRequest:]

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

回答赏金提供者的查询:

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

我发现这个问题直接解决了这个问题

尽管Apple的文档另有说明NSURLCache iOS上的NSURLCache根本不进行任何磁盘(闪存)缓存。 您可以将NSURLCache子类NSURLCache以更改获取和存储操作的行为以使用磁盘(如SDURLCache那样),但由于以下严格限制了如何使用和实现缓存,这不会像您那样有效。 d期望:

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

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

(强调我的。)

这似乎是被召唤出来的行为的原因。 正如当前接受的答案指出的那样ASIHTTPRequest是此行为的预期解决方法。

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

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

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

如此处所述 NSURLConnection不调用storeCachedResponse:forRequest:如果文件大小超过50kb(52428字节)。
尝试ASIHTTPRequest 缓存

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

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

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

所以像这样配置你的URLCache

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM