ASIHTTPRequest似乎总是缓存JSON数据

时间:2012-02-12 19:21:31

标签: objective-c ios caching asihttprequest

我正在使用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,即使它未被修改,这将降低性能。

如何让它首先检查服务器是否修改了数据,并检索它是否被修改?目前我从一个php url获取JSON数据作为动态响应,因此没有文件可以检查数据的日期。

可能是什么解决方案?

此致

2 个答案:

答案 0 :(得分:1)

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

所以,必须有其他东西 - 看起来你和服务器之间有一个缓存代理服务器,这就是设置Cache-Control有所不同的原因。

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

答案 1 :(得分:0)

根据ASIHTTPRequest的文档,调用方法

[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

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