阻止initWithContentsOfURL:使用缓存

时间:2014-09-08 18:27:33

标签: ios objective-c cocoa-touch url caching

我使用此行来获取网址的内容:

NSString *result=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:URL]
                                                encoding:NSUTF8StringEncoding 
                                                   error:nil];

问题是当连接错误时,它会从缓存中加载内容。有没有办法避免这种行为?例如,清除缓存或其他内容。

2 个答案:

答案 0 :(得分:1)

首先,不建议使用initWithContentsOfURL:encoding:error从网络资源加载数据。

其次,如果要控制缓存行为,则应使用NSURLRequestNSURLRequest允许您通过设置请求的cachePolicy来自定义请求的缓存行为。在您的情况下,您想使用NSURLRequestReloadIgnoringLocalCacheData。使用NSURLConnection同步执行此操作的示例如下:

NSString        *result     = nil;
NSData          *data       = nil;
NSURLResponse   *response   = nil;
NSURLError      *error      = nil;
NSURLRequest    *request    = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20L];
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (response != nil && [data length] > 0){
    result = [NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

请注意,这是一个非常天真的实现,它不会检查返回的HTTP状态代码,响应的mime类型,或执行任何错误处理。建议不要同步加载网络资源或从主线程加载网络资源。更好的实施方式是使用sendAsynchronousRequest:completion:NSURLSession

但是,它确实在高级别上演示了回答问题所需要做的事情:NSURLRequest指定此请求永远不应使用本地缓存,并且返回的数据用于创建{{1的实例}}

答案 1 :(得分:0)

添加到URL的随机值的简单cache-buster虚拟参数应该有效。 正如@Josh-Caswell所说,使用NSURLRequest。虽然在代理服务器的情况下,仅使用NSURLRequest可能没有帮助,您仍然需要缓存破坏程序。