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
提前谢谢。
答案 0 :(得分:5)
最后,我能够弄明白......!所以这是在缓存期间发生的事情,
MKNetworkKit缓存超轻,它可以缓存你的 NSMutableDictionary中的响应。这不会导致高记忆 用法?是。当然,但MKNetworkKit很聪明。它观察到了 UIApplicationDidReceiveMemoryWarningNotification并刷新 字典到磁盘。下次向缓存发出请求时 URL,缓存的数据被带回内存。实际上它有一个 内存缓存和磁盘缓存,并使用最近最少使用的 将项目刷新到磁盘的算法。 MKNetworkEngine类有 可以覆盖的方法来控制缓存成本。
所以,当我第一次运行应用程序时,响应被缓存在“内存”中而不是“磁盘”中。当我冷启动应用程序时,之前缓存的响应从未从“内存”转移到“磁盘”。 (这就是为什么,在应用程序的缓存目录中甚至没有缓存的文件..!)因此,successBlock永远不会被调用两次,带有缓存的响应,因为,没有一个..!
为了克服这个问题,它只用一行代码覆盖了一个函数......!
- (int) cacheMemoryCost
{
return 0;
}