如何使用NSURLCache在脱机时返回caching的API响应(iOS应用程序)

我希望有人能够对我一直在研究的几件事情有所了解,但是没有取得太多的进展。

我想利用NSURLCache来返回我在iOS应用程序中进行的API调用的caching响应。 当设备在线时,如果足够近,我想返回caching的响应,否则从远程取回。 当设备离线时,我想立即返回caching的响应(如果有的话),而不pipe它的年龄。

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

每个http://nshipster.com/nsurlcache/我初始化didFinishLaunchingWithOptionssharedURLCache ,并将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];

我已经阅读了关于这个主题的这些和其他post:

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

我想知道是否有人在使用标准的NSURLCache之前成功地实现了这个function(对NSURLCache成功案例也很感兴趣,但是Peter S.说,​​支持iOS5磁盘caching,因此不再需要SDURLCache ,也就是说,我想使用默认的内置caching)。

提前致谢!

你看到这个post了吗?

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

看起来这可能是iOS 6的一个漏洞。毛泽东在这篇文章中不得不说的是:

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

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

除非你所有的调用都是100%GET,并且没有副作用或时间依赖性,那么这是危险的。