9

尽管 Apple 的文档另有说明NSURLCache但在 iOS 上根本不做任何磁盘(闪存)缓存。您可以子类NSURLCache化以更改 fetch 和 store 操作的行为以使用磁盘(就像这样SDURLCache做),但是由于以下对缓存的使用和实现方式的严重限制,这不会像您期望的那样工作:

  • NSURLConnection甚至不需要storeCachedResponse:forRequest:超过大约 50KB 的文件(确切地说,>= 52428 字节)。这使得子类NSURLCache化对我们的使用毫无意义(200KB 图像),因为它甚至不会进入缓存。因此,我们必须在上一级手动添加缓存NSURLConnection
  • 即使手动调用 NSURLCache 的内置函数storeCachedResponse:forRequest:,它也只会在小于 180KB 的情况下将响应存储在内存中。我通过手动调用 storeCachedResponse 对此进行了测试,发现之前/之后currentMemoryUsage对于超过 180KB 的数据长度没有改变。所以我们也必须编写自己的 LRU 内存缓存。

有没有其他人注意到这些问题?还是我缺少什么?

仅供参考,我在模拟器和 iPad 2 上运行 iOS 4.3。

4

4 回答 4

3

我建议使用 ASIHTTPRequest 库而不是 NSURLRequest:

http://allseeing-i.com/ASIHTTPRequest/How-to-use

它有一个强大的缓存 API:

http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_a_download_cache

于 2011-08-31T01:11:59.613 回答
2

我不确定它如何用于 UIWebviewuw,但是当您使用 NSURLRequest 时,文件的最大大小取决于您如何初始化 URLCache (initWithMemoryCapacity:(NSUInteger)memoryCapacity ...)

于 2013-01-25T10:54:58.203 回答
1

我建议使用three20库和TTURLRequest。这似乎对大数据量有很好的缓存,因为它用于 Facebook,尤其是图片。

TTURLRequest 几乎是 NSURLRequest 的替代品,因此应该很容易迁移,并且对 Three20 的其余部分没有太大的依赖

于 2011-08-29T10:50:05.063 回答
0

查看我的 AFNetworking 分支,其中包含支持磁盘保存的自定义类 NSURLCache:https ://github.com/steipete/AFNetworking/tree/disk-cache

于 2011-09-13T11:56:01.610 回答