AFNetworking(AFHttpClient)离线模式不适用于NSURLRequestReturnCacheDataDontLoad策略

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

我希望在将请求caching策略设置为NSURLRequestReturnCacheDataDontLoad之后,getPath:parameters:success:failure:在离线状态下将成功caching数据。 但是,即使caching中存在数据(通过使用代码检查caching来validation),getPath在飞行模式下也会失败。

AFNetworking有一个线程github: https : //github.com/AFNetworking/AFNetworking/issues/378但似乎这个问题根本没有解决。 AFNetworking的作者只是简单地指出了苹果的文件 ,并表示:

NSURLRequestReturnCacheDataDontLoad指定应使用现有的caching数据来满足请求,而不pipe其年龄或过期date。 如果高速caching中没有对应于URL加载请求的现有数据,则不会尝试从源数据源加载数据,并认为加载失败。 此常数指定与“脱机”模式类似的行为。

正如苹果所说,NSURLRequestReturnCacheDataDontLoad是专为离线模式devise的。

我在iOS6testing,我testing了NSURLCache和SDURLCache,都有相同的结果。

请求失败,错误消息:

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

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

AFNetworking中有一个讨论线程正是为了这个问题: https : //github.com/AFNetworking/AFNetworking/issues/566

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

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

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