iOS上的NSURLConnection不会尝试缓存大于50KB的对象

时间:2011-08-23 19:25:14

标签: objective-c ios caching nsurlconnection nsurlcache

尽管Apple的文档indicating otherwise,但iOS上的NSURLCache根本不执行任何磁盘(闪存)缓存。您可以将NSURLCache子类化以更改获取和存储操作的行为以使用磁盘(如SDURLCache所做的那样),但由于以下严格限制如何使用和实现缓存,这不会工作和你期望的一样好:

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

有没有人注意到这些问题?或者有什么我想念的东西?

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

4 个答案:

答案 0 :(得分:3)

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

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

它有一个强大的缓存API:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

TTURLRequest几乎是NSURLRequest的替代品,所以应该很容易转移,并且对Three20的其余部分没有多少依赖

答案 3 :(得分:0)

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