尽管Apple的文档indicating otherwise,但iOS上的NSURLCache
根本不执行任何磁盘(闪存)缓存。您可以将NSURLCache
子类化以更改获取和存储操作的行为以使用磁盘(如SDURLCache
所做的那样),但由于以下严格限制如何使用和实现缓存,这不会工作和你期望的一样好:
NSURLConnection
甚至没有为{50}以上的文件调用storeCachedResponse:forRequest:
(确切地说,> = 52428字节)。这使得子类化NSURLCache
对于我们的使用毫无意义(200KB图像),因为它甚至不会进入缓存。因此,我们必须在NSURLConnection
以上的级别手动添加缓存。storeCachedResponse:forRequest:
,它也只会将响应存储在内存中,如果它小于约180KB。我通过手动调用storeCachedResponse测试了这一点,并且发现currentMemoryUsage
之前/之后没有因大约180KB以上的数据长度而改变。所以我们也必须编写自己的LRU内存缓存。有没有人注意到这些问题?或者有什么我想念的东西?
仅供参考,我在模拟器和iPad 2上运行iOS 4.3。
答案 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