如何从NSURLSessionTask禁用缓存

时间:2014-06-20 13:29:02

标签: ios caching nsurlsessiontask

在我的iOS应用中,我使用NSURLSessionTask将json数据下载到我的应用中。我发现当我直接从浏览器调用url时,我得到了一个最新的json,当它从应用程序中调用时,我得到了旧版本的json。

这是由于缓存吗?如何告诉NSURLSessionTask不使用缓存。

这是我使用的电话:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

谢谢!

7 个答案:

答案 0 :(得分:42)

如果您从@runmad中读取链接,则可以在流程图中看到,如果文件的HEAD未更改,则在设置cachePolicy时仍将使用缓存版本。

在Swift3中,我必须这样做才能让它工作:

let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil

let session = URLSession.init(configuration: config)

这有一个真正的非缓存版本的文件,我需要进行带宽估算计算。

答案 1 :(得分:35)

您还可以使用指定默认缓存策略的sharedSession创建自己的NSURLSession,而不是使用NSURLSessionConfiguration。因此,为您的会话定义一个属性:

@property (nonatomic, strong) NSURLSession *session;

然后:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
self.session = [NSURLSession sessionWithConfiguration:configuration];

然后使用该会话的请求将使用requestCachePolicy

答案 2 :(得分:6)

Swift 3,Xcode 8

extension UIImageView {
func donloadImage(fromUrl url: URL) {
    let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() { () -> Void in
            self.image = image
        }
    }.resume()
}

答案 3 :(得分:4)

以下代码对我有用,捕获的是将URLCache设置为nil。

 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;

答案 4 :(得分:2)

Swift 4.2

我知道已经有一段时间了,但是以防将来对某人有所帮助。

您还可以使用.ephemeral的{​​{1}}配置属性,该属性在默认情况下不会保存任何cookie和缓存。

随着文档的发展,

  

临时会话配置对象与默认会话配置相似,不同之处在于相应的会话对象不将缓存,凭据存储或任何与会话相关的数据存储到磁盘上。而是将与会话相关的数据存储在RAM中。

因此,您的代码可能如下所示:

URLSession

答案 5 :(得分:0)

您需要在cachePolicy上设置NSURLRequest,此处为documentation

Here's some insight as to how caching works一般。

您可以阅读可用于指定cachePolicy here的特定枚举:

enum
{
   NSURLRequestUseProtocolCachePolicy = 0,
   NSURLRequestReloadIgnoringLocalCacheData = 1,
   NSURLRequestReturnCacheDataElseLoad = 2,
   NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;

例如,你会这样做:

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];

答案 6 :(得分:0)

我正在获取相同网址的缓存图片..所以我已经完成了这个

imageView.imageFromUrl(self.shareData.userResponseData["photo"] as! String)

extension UIImageView {

public func imageFromUrl(urlString: String) {

    if let url = NSURL(string: urlString) {

        let request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 60.0)

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {

            (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            self.image = UIImage(data: data)

        }
    }
}

}