aks*_*gde 1 ios ios5 ios6 mknetworkkit mknetworkengine
我遇到了MKNetworkKit缓存的非常不寻常的问题.简单来说,问题是"它不起作用"..!
我创建了一个有问题的简单测试项目.该项目什么都不做,但只是向http://where.yahooapis.com/提出简单的GET请求,以获取城市名称的地址或信息.响应,应该在第一次运行时被追逐,并且从第二次调用完成处理程序两次,一次使用缓存响应,再一次使用获取的响应.正如您在下面看到的,它取自http://blog.mugunthkumar.com/coding/ios-tutorial-image-cache-and-loading-thumbnails-using-mknetworkkit/
如果您是第二次拨打电话,MKNetworkKit会使用缓存数据调用SAME完成处理程序.当网络连接正常时,MKNetworkKit会两次调用完成处理程序.首先使用缓存数据,然后在从服务器获取最新数据之后再次使用.
好吧,不寻常的是,我运行应用程序,它没有缓存,我再次运行应用程序,它再次没有缓存,经过一些随机运行突然缓存开始工作.我删除了应用程序并再次运行它,缓存不会工作,直到一些随机运行和问题重复..!
仅供参考,我使用了从GIT下载的最新MKNetworkkit .
我不确定我的代码是否有问题,或者是MKNetworkKit本身的错误.所以请仔细阅读代码,并告诉我它是否是导致此问题的MKNetworkKit.
以下是下载示例项目的链接[https://www.box.com/s/tsfw3z0avpti051xbyhv] 4
预先感谢.
最后,我能够弄清楚..!所以这是在缓存期间发生的事情,
MKNetworkKit缓存超轻量级,它将您的响应缓存在NSMutableDictionary中.这不会导致高内存使用量吗?是.当然,但MKNetworkKit很聪明.它观察UIApplicationDidReceiveMemoryWarningNotification并将字典刷新到磁盘.下次向缓存的URL发出请求时,缓存的数据将被带回内存.因此,它实际上具有内存缓存和磁盘缓存,并使用最近最少使用的算法将项目刷新到磁盘.MKNetworkEngine类具有可以覆盖的方法来控制缓存成本.
所以,当我第一次运行应用程序时,响应被缓存在"内存"中而不是"磁盘"中.当我冷启动应用程序时,先前缓存的响应从未从"内存"转移到"磁盘".(这就是为什么,在应用程序的缓存目录中甚至没有缓存的文件..!)因此,successBlock永远不会被调用两次,带有缓存的响应,因为,没有一个..!
为了解决这个问题,它只用一行代码覆盖了一个函数......!
- (int) cacheMemoryCost
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |