AFNetworking(AFHttpClient)离线模式无法使用NSURLRequestReturnCacheDataDontLoad策略

时间:2012-12-22 11:25:28

标签: ios ios5 afnetworking offline-caching

我在我的应用程序中使用AFNetworking,并尝试使用缓存数据(如果可用)使其在脱机模式下工作。

我预计在将请求缓存策略设置为NSURLRequestReturnCacheDataDontLoad之后,getPath:parameters:success:failure:在脱机时将使用缓存数据成功。但是,即使缓存中有数据(我通过使用代码检查缓存进行验证),getPath也会在飞行模式下失败。

AFNetworking github中有一个帖子:https://github.com/AFNetworking/AFNetworking/issues/378但似乎根本没有解决这个问题。 AFNetworking的作者只是指向Apple's document,它说:

  

NSURLRequestReturnCacheDataDontLoad   指定现有缓存   数据应该用于满足请求,无论其年龄或年龄   截止日期。如果缓存中没有现有数据   对应于URL加载请求,不尝试加载   来自始发源的数据,以及负载被认为具有   失败。此常量指定与a类似的行为   “离线”模式。

正如Apple所说,NSURLRequestReturnCacheDataDontLoad完全是为离线模式设计的。

我在iOS6中进行测试,我使用NSURLCache和SDURLCache进行了测试,结果都相同。

请求失败,错误消息:

  

2012-12-22 03:11:18.988 Testapp [43692:907]错误:错误   Domain = NSURLErrorDomain Code = -1009“Internet连接出现   离线。“UserInfo = 0x211b87c0   {NSErrorFailingURLStringKey = HTTP://Testapp.com/api/v1/photo/latest/,   NSErrorFailingURLKey = HTTP://Testapp.com/api/v1/photo/latest/,   NSLocalizedDescription = Internet连接似乎处于脱机状态。   NSUnderlyingError = 0x211b9720“Internet连接似乎是   脱机。“}

1 个答案:

答案 0 :(得分:7)

原来,这是iOS 6中的一个错误。

AFNetworking中存在一个完全针对此问题的讨论主题:https://github.com/AFNetworking/AFNetworking/issues/566

感谢guykogus关于这个问题的提示和实验。我在这个问题上度过了一个晚上!

总结解决方法是从缓存中读取响应,而不是使用NSURLRequestReturnCacheDataDontLoad策略:

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}