1

我正面临 MKNetworkKit 缓存非常不寻常的问题。简而言之,问题是“它不起作用”..!

我创建了一个有问题的简单测试项目。该项目什么都不做,只是向http://where.yahooapis.com/发出一个简单的 GET 请求,以获取城市名称的地址或信息。响应应该在您第一次运行时被 chached,并且从第二次开始,完成处理程序将被调用两次,一次是缓存响应,另一次是获取的响应。正如您在下面看到的,取自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

预先感谢。

4

1 回答 1

5

最后,我能够弄清楚..!所以这就是在缓存期间发生的事情,

MKNetworkKit 缓存是超轻量级的,它将您的响应缓存在 NSMutableDictionary 中。这不会导致高内存使用吗?是的。当然,但 MKNetworkKit 很聪明。它观察 UIApplicationDidReceiveMemoryWarningNotification 并将字典刷新到磁盘。下次您向缓存的 URL 发出请求时,缓存的数据将被带回内存。所以实际上,它有一个内存缓存和磁盘缓存,并使用最近最少使用的算法将项目刷新到磁盘。MKNetworkEngine 类具有可以被覆盖以控制缓存成本的方法。

所以,发生的事情是,当我第一次运行应用程序时,响应被缓存在“内存”中而不是“磁盘”中。当我冷启动应用程序时,之前缓存的响应从未从“内存”传输到“磁盘”。(这就是为什么应用程序的缓存目录中甚至没有缓存文件的原因......!)因此,successBlock 从未被调用两次,并带有缓存响应,因为没有......!

为了克服这个问题,它只是用一行代码覆盖一个函数......!

- (int) cacheMemoryCost
{
    return 0;
}
于 2012-11-30T10:31:13.260 回答