13

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

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

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

根据http://nshipster.com/nsurlcache/我初始化一个sharedURLCacheindidFinishLaunchingWithOptions并将 AFNetworkingsetCacheResponse块设置为如下所示:

NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy];
NSMutableData *mutableData = [[cachedResponse 数据] 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不再需要,即我想使用默认内置缓存)。

提前致谢!

4

2 回答 2

2

你看到这个帖子了吗?

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

看起来这可能是 iOS 6 的一个错误。这是毛泽东在帖子中所说的:

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

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache]     cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}
于 2013-07-13T02:58:27.427 回答
-4

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

于 2013-03-29T17:45:00.823 回答