我只是花了很长时间在NSURLCache上大喊大叫,所以我给出了一些建议,希望其他人能避免我的不幸。
一切都有了合理的开端。我的新应用程序项目只针对iOS 5和更高版本,所以我想我可以利用新的NSURLCache实现来满足所有的web缓存需求。我需要一个自定义的NSURLCache子类来处理一些特殊的任务,但是这一切似乎都得到了API的帮助。快速阅读一下文档,然后我就开始参加比赛了:
[NSURLCache setSharedURLCache:[[MyCustomCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 //8mb
diskCapacity:32 * 1024 * 1024 // 32mb
diskPath:@"webcache.db"]];我认为8mb缓存可以启动,我将使用一个更大的磁盘缓存来备份它,这样我们就可以在本地提供更多更大的映像。我将剩下的网络代码连接起来使用NSURLConnection (实际上,我使用了MKNetworkKit,但事实证明这是不相关的),并期望从缓存中得到很好的东西。当然,所有应该缓存的请求都会尽职尽责地保存到缓存中,当从缓存中处理响应时,响应会迅速返回。这是一部定期制作的“彭赞斯海盗”,在我的关系网里随处可见。
只是有些东西没有加起来。可以从缓存中处理的请求仍然通过网络发出。除非它们不是。,缓存是否真的用于满足请求似乎完全是随机的和断断续续的。我沮丧地扯下头发,从字面上挖掘所有的东西,试图弄清楚到底发生了什么。我构建测试应用程序,在各地设置断点,撕开数据包跟踪,阅读互联网上提到NSURLCache的每一个单词,试验缓存控制头,注释掉代码,绕过子类,甚至通过程序集为NSURLCache及其CFNetworking好友进行艰苦的跟踪,试图了解其背后的神秘逻辑。我极大地提高了我对ARM和Objective调用约定的认识,并学习了一些关于低级调试的知识,但在实际中却找不出到底发生了什么。整个事情的感觉更像是尤兰蒂的Nightmare Song,而不是海盗国王的良性专政,我几乎快要把它扔掉了。
TL/DR版本: NSURLCache似乎正常工作,但即使有缓存结果可用,也不会随机返回缓存的结果。
发布于 2012-07-16 03:57:09
最后,我尝试了一个不同的排列,所有我一直在摆弄的部分。我将内存和磁盘缓存大小都设置为8mb。
看哪,一切怪事都消失了!所有应该被缓存的东西都被保存了。所有应该来自缓存的东西都是在没有网络请求的情况下得到服务的。
看来,NSURLCache在iOS5中的实现还没有完成。它确实使用磁盘和内存缓存(与iOS4和更早的缓存不同,后者只实现内存缓存),但是当请求丢失时,它实际上不会通过内存缓存传递到磁盘缓存。因此,它基本上是盲运气(嗯,盲运气受所有其他网络和缓存使用的影响),无论给定的响应在内存中是否处于正确的时刻。这可能对减少设备上的闪存文件IO很有用,但如果您期望类的rational行为,则会非常讨厌。
于是,我带着欢快的歌声和快乐的舞蹈,检查我的两句话,赶紧去酒吧,最后和so (还有一份苹果臭虫报告)分享这些知识,希望别让其他人再经历这种痛苦。
,这个不幸故事的寓意:如果您尝试在iOS5上使用比内存容量更大的磁盘容量,那么就会发生奇怪和邪恶的事情。不要这样做。避免成为魔法精灵的敌人。
发布于 2012-08-07 06:04:15
https://stackoverflow.com/questions/11497923
复制相似问题