8

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

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

AFNetworking github 中有一个线程:https ://github.com/AFNetworking/AFNetworking/issues/378 但似乎这个问题根本没有解决。AFNetworking 的作者只是简单地指向苹果的文档,它说:

NSURLRequestReturnCacheDataDontLoad 指定应该使用现有的缓存数据来满足请求,而不管它的年龄或到期日期。如果缓存中不存在对应于 URL 加载请求的现有数据,则不尝试从原始源加载数据,则认为加载失败。此常量指定类似于“离线”模式的行为。

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

我在 iOS6 上测试,我用 NSURLCache 和 SDURLCache 都测试过,结果都是一样的。

请求失败,错误信息:

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

4

1 回答 1

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
    ....
}
于 2012-12-22T21:53:41.163 回答