我在我的应用程序中使用 AFNetworking,并尝试通过使用缓存数据(如果可用)使其在离线模式下工作。
我预计在将请求缓存策略设置为 NSURLRequestReturnCacheDataDontLoad 后, getPath:parameters:success:failure: 将在离线时成功处理缓存数据。但是,即使缓存中有数据(我通过使用代码检查缓存进行了验证),getPath 在飞行模式下也会失败。
AFNetworking github 上有一个线程:https://github.com/AFNetworking/AFNetworking/issues/378 https://github.com/AFNetworking/AFNetworking/issues/378但似乎这个问题根本没有得到解决。 AFNetworking的作者简单地指出苹果的文档 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSURLRequestUseProtocolCachePolicy,它说:
NSURLRequestReturnCacheDataDontLoad
指定现有缓存
数据应该用于满足请求,无论其年龄或
截止日期。如果缓存中没有现有数据
对应于 URL 加载请求,不会尝试加载
来自原始源的数据,并且负载被认为具有
失败的。该常量指定的行为类似于
“离线模式。
正如苹果所说,NSURLRequestReturnCacheDataDontLoad 正是为离线模式而设计的。
我正在iOS6中进行测试,我使用NSURLCache和SDURLCache进行了测试,都有相同的结果。
请求失败,错误信息:
2012-12-22 03:11:18.988 Testapp[43692:907] 错误:错误
Domain = NSURLErrorDomain Code = -1009“互联网连接似乎
离线。” UserInfo=0x211b87c0
{NSErrorFailingURLStringKey=http://Testapp.com/api/v1/photo/latest/,
NSErrorFailingURLKey=http://Testapp.com/api/v1/photo/latest/,
NSLocalizedDescription=互联网连接似乎已离线。,
NSUnderlyingError=0x211b9720 “互联网连接似乎是
离线。”}
事实证明,这是 iOS 6 中的一个错误。
AFNetworking 中有一个专门针对这个问题的讨论线程:https://github.com/AFNetworking/AFNetworking/issues/566 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
....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)