【问题标题】:ASIHTTPRequest seems to cache JSON data alwaysASIHTTPRequest 似乎总是缓存 JSON 数据
【发布时间】:2012-02-12 19:21:30
【问题描述】:

我正在使用 ASIHTTPRequest API 从 Web 端获取一些 JSON 数据。我正在使用异步请求而不更改默认缓存属性。代码如下:

__unsafe_unretained ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];

request.timeOutSeconds = 30;
[request setCompletionBlock:^(void)
 {
     NSString *str = [request responseString];
     /*
     *
     *
     */
 }];
[request setFailedBlock:^(void)
 {
     NSLog(@"status: %@",[request responseStatusMessage]);
     NSLog(@"%@ : %@",[request url],[[request error] debugDescription]);         
 }];
[request startAsynchronous];

但是,虽然服务器中的 JSON 数据内容发生了变化,但获取的 JSON 数据仍然是旧数据。

我使用网络浏览器检查了笔记本电脑和 iPhone safari 上的数据。当我在 JSON 更改后请求 url 时,它首先返回旧数据,但如果我刷新页面,它会返回更新数据。但在应用中,ASIHTTPRequest 总是返回旧数据。

我还尝试调试 ASIHTTPRequest 代码以查看是否使用了任何缓存数据。但它似乎从不使用下载缓存,因为它尚未设置。它从不进入 [useDataFromCache] 方法。

可能是什么问题?如何强制 ASIHTTPRequest 检查服务器上是否有更新的数据,并使其获取真正更新的 JSON?

编辑

我使用了 Cache-Control 标头,现在我得到了正确的更新 JSON 数据。代码如下:

[request addRequestHeader:@"Cache-Control" value:@"no-cache"];

但是,我认为从现在开始,即使未修改 JSON,请求也会始终尝试检索 JSON,这会降低性能。

我怎样才能让它首先检查服务器是否修改了数据,如果修改了则检索它?目前我从 php url 获取 JSON 数据作为动态响应,所以没有文件可以检查数据的最新性。

有什么解决办法?

问候,

【问题讨论】:

    标签: objective-c ios caching asihttprequest


    【解决方案1】:

    鉴于您所说的一切,ASIHTTPRequest 似乎不太可能缓存响应。

    所以,必须有别的东西 - 看起来你和服务器之间有一个缓存代理服务器,这就是为什么设置 Cache-Control 会有所作为。

    它可能是您本地网络上的代理服务器,也可能在您的 ISP 上,也可能在您正在使用的网络服务器的前面。

    【讨论】:

    • 嗯,我的网络有代理服务器。但我记得我也尝试在公共网络中使用该应用程序,再次返回旧数据。但是我仍然无法弄清楚如何在检查数据的最新性的同时执行缓存策略。如果我在服务器端的响应标头中提供 Cache-Control 标头,它也会起作用吗?如果是,使用(ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy) 数据缓存策略是否可行?
    • 感谢您的建议,我们意识到服务器端实际上是在缓存响应,它现在可以正常工作了。
    【解决方案2】:

    根据ASIHTTPRequest的文档,调用方法

    [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
    

    将清除缓存。在发送请求之前调用此方法,它应该会为您提供更新的 JSON 数据。

    【讨论】:

    • 我试过这个(也添加到删除会话缓存)。 [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; [[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICacheForSessionDurationCacheStoragePolicy]; __unsafe_unretained ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url]; 但它没有用。我认为它不应该与 ASIHTTP 缓存有关,因为根据文档,它默认不使用缓存。但我找不到任何其他导致这种奇怪行为的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多