如何使用NSURLCache在离线时返回缓存的API响应(iOS App)

时间:2013-03-29 14:53:35

标签: ios objective-c afnetworking nsurlcache

我希望有人可以对我正在研究的一些事情有所了解,但没有取得多大进展。

我想利用NSURLCache返回我在iOS App中进行的API调用的缓存响应。当设备在线时,我想返回缓存的响应,如果它已经足够,否则从远程获取。当设备离线时,我想立即返回缓存的响应(如果有的话),无论它的年龄如何。

我正在使用AFNetworking。我正在调用的API调用是我控制的服务器。协议是HTTPS。 Cache-Control响应标头目前为"max-age=0, public"。我目前没有设置缓存相关的请求标头(我应该吗?)。我在离线时将请求的缓存策略设置为NSURLRequestReturnCacheDataDontLoad,并在联机时使用默认的NSURLRequestUseProtocolCachePolicy。我可以在磁盘上的默认Cache.db中看到请求及其响应。但是,当我离线时,所有请求都会失败(没有缓存的响应(尽管看起来已被缓存)正在使用/返回。

http://nshipster.com/nsurlcache/我在sharedURLCache初始化didFinishLaunchingWithOptions并将AFNetworking setCacheResponse块设置为以下内容:

NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; 
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowed;
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] data:mutableData userInfo:mutableUserInfo storagePolicy:storagePolicy];

我已阅读有关该主题的这些和其他帖子:

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html

我想知道在使用标准NSURLCache之前是否有人成功实现了此功能(也对涉及SDURLCache的成功案例感兴趣,但Peter S.表示从iOS5开始支持磁盘缓存不再需要SDURLCache,即我想使用默认的内置缓存)。

提前致谢!

2 个答案:

答案 0 :(得分:2)

你看到这篇文章吗?

AFNetworking (AFHttpClient) offline mode not working with NSURLRequestReturnCacheDataDontLoad policy

看起来它可能是iOS 6的一个错误。以下是Robert Mao在帖子中所说的内容:

  

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

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

答案 1 :(得分:-4)

除非您的所有通话都是100%GET并且没有副作用或时间依赖性,否则这很危险。