当前位置: 首页 > 知识库问答 >
问题:

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

冯奇思
2023-03-14

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

我想利用 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个答案

姬俊远
2023-03-14

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

李烨
2023-03-14

你看到这个帖子了吗?

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

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

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

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache]     cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}
 类似资料:
  • 我有一个简单的用例,服务器为请求返回Etag,并将该Etag作为标头(即)添加到所有后续url请求。如果响应中有变化,服务器可以用响应,否则可以用响应。对于后者,重用缓存中的响应是有意义的。但是okhttp总是返回作为缓存响应。 我做了一些故障排除,okhttp在内部将响应写入磁盘,但是不会将其返回到。仔细研究类,有一些文档明确说明不会使用缓存: 编辑-更正,Okhttp正确地添加了etag标头。

  • 我读到了关于和的相互矛盾的语句。 这个答案说: 使用must-revalidate时,如果服务器不响应重新验证请求,浏览器/代理应该返回504错误。在没有缓存的情况下,它只显示缓存的内容 然而,“只显示缓存的内容”而不进行重新验证与https://datatracker.ietf.org/doc/html/RFC7234#section-5.2.1.4中的内容相矛盾: “no-cache”requ

  • 我调用服务器数据通过使用ajax在index.html.它是完美的获取这些数据。现在,我正在和服务人员一起工作。我可以缓存所有的静态资产(图像,js,css),并在Chrome开发工具的应用程序选项卡中的缓存存储中检查这些缓存的资产。我可以在网络选项卡中看到这些资产也被缓存(磁盘缓存)。 现在,我想使用ServiceWorker缓存这些ajax响应(图像文件数组)。在“网络”选项卡中,我可以看到它

  • 我要和服务人员一起建立我的preactjs网站。 使用Sw precache插件 我只是查看它存储在缓存存储中的缓存项,我期望的条目都在那里,但它们有一个空响应。 我与服务人员检查了其他一些网站,并注意到他们的条目有“OK”的响应。 只是想知道是什么触发了缓存响应说“OK”而不是空白。 我发现的另一个例子是,有些人返回OK,其他人返回空白

  • 我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一

  • 问题内容: 我想确保浏览器永远不会缓存服务器的响应,这样即使发出两个相同的请求(相隔一纳秒),也始终会与服务器联系。这是实现此目标的正确方法: 谢谢唐 问题答案: 不,那不是正确的方法。这是正确的方法: 您可能会看到其他人在建议其他条目/属性,但是当至少提及上述内容时,它们是完全不相关的。 更改后,请不要忘记在测试之前清除浏览器缓存。 也可以看看: 网站站长缓存教程