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

Alf*_*sen 13 objective-c nsurlcache ios afnetworking

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

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

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

根据http://nshipster.com/nsurlcache/我初始化一个sharedURLCachein 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不再需要,即我想使用默认内置缓存).

提前致谢!

Del*_*own 2

你看到这个帖子了吗?

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

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

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

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