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

ahe*_*ang 9 iphone objective-c uiwebview ipad ios

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

MrG*_*mez 11

回答赏金提供者的查询:

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

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

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

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

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

(强调我的.)

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

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

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

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


Ser*_*nov 4

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