提问者:小点点

如何在脱机时使用 NSURL缓存返回缓存的 API 响应(iOS 应用程序)


我希望有人能对我一直在研究但没有取得多大进展的一些事情有所帮助。

我想利用 NSURLCache 来返回我在 iOS 应用程序中进行的 API 调用的缓存响应。当设备联机时,如果缓存的响应足够新,我想返回它,否则从远程获取。当设备脱机时,我希望立即返回缓存的响应(如果有),无论其年龄如何。

我正在使用AFNetworking。我正在对我控制的服务器进行API调用。协议是HTTPS。Cache-Control响应头当前为“max-age=0,public”。我当前没有设置与缓存相关的请求标头(应该吗?)。脱机时,我将请求的缓存策略设置为NSURLRequestReturnCacheDataDontLoad,联机时使用默认的NSURLRrequestUseProtocolCachePolicy。我可以在默认的缓存中看到请求及其响应。磁盘上的db。然而,当我脱机时,所有请求都会失败(没有缓存的响应(尽管看起来已经缓存))。

http://nshipster.com/nsurlcache/我在didFinishLaunchingWithOptions中初始化一个share dURLCache,并将AFNetworksetCacheResponse块设置为如下所示:

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

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

提前致谢!


共2个答案

匿名用户

你看到这个帖子了吗?

AFNetwork(AFHttpClient)脱机模式不适用于NSURLRequest estRecnCacheDataDontLoad策略

看起来可能是iOS 6的bug。以下是罗伯特·毛在博文中所说的话:

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

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

匿名用户

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