iOS上的NSURLConnection不会尝试caching大于50KB的对象
尽pipe苹果的文档指出 ,iOS上的NSURLCache
根本不做任何磁盘(闪存)caching。 您可以NSURLCache
子类,以更改获取和存储操作的行为来使用磁盘(就像SDURLCache
一样),但是由于以下严重的caching使用和实现限制, d期望:
-
NSURLConnection
甚至不会调用storeCachedResponse:forRequest:
对于超过大约50KB(storeCachedResponse:forRequest:
是storeCachedResponse:forRequest:
52428字节)的文件。 这使得NSURLCache
我们的使用(200KB图像)毫无意义,因为它甚至不会进入caching。 因此,我们必须手动添加高于NSURLConnection
的级别的caching。 - 即使手动调用NSURLCache的内置
storeCachedResponse:forRequest:
如果响应小于180KB,它只会将响应存储在内存中。 我通过手动调用storeCachedResponse来testing这个,并且看到currentMemoryUsage之前/之后的数据长度在大约180KB以上没有改变。 所以我们也必须编写自己的LRU内存caching。
有没有人注意到这些问题? 还是有什么我失踪?
仅供参考,我在模拟器和iPad 2上运行iOS 4.3。
我build议使用ASIHTTPRequest库而不是NSURLRequest:
http://allseeing-i.com/ASIHTTPRequest/How-to-use
它有一个健壮的cachingAPI:
http://allseeing-i.com/ASIHTTPRequest/How-to-use#using_a_download_cache
我不确定它是如何工作的一个UIWebvieuw,但是当你使用NSURLRequest文件的最大尺寸取决于你如何初始化URLCache(initWithMemoryCapacity:(NSUInteger)memoryCapacity …)
我build议使用three20库和TTURLRequest。 这似乎有很好的caching大数据量,因为它用于Facebook,特别是图片。
TTURLRequest几乎是一个NSURLRequest的替代品,所以应该很容易移动,并且没有太多的依赖Three20的其余部分
看看我的AFNetworking的fork包含一个支持磁盘保存的NSURLCache自定义类: https : //github.com/steipete/AFNetworking/tree/disk-cache