如何从NSURLSessionTask禁用caching

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

这是由于caching? 我怎么能告诉NSURLSessionTask不使用caching。

这是我使用的呼叫:

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

谢谢!

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

在Swift3中,我必须这样做才能使其工作:

 let config = URLSessionConfiguration.default config.requestCachePolicy = .reloadIgnoringLocalCacheData config.urlCache = nil let session = URLSession.init(configuration: config) 

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

您可以使用指定默认caching策略的NSURLSessionConfiguration创build自己的sharedSession ,而不是使用sharedSession 。 所以,为你的会话定义一个属性:

 @property (nonatomic, strong) NSURLSession *session; 

接着:

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

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

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() } 

下面的代码为我工作,赶上设置URLCache为零。

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

你需要在NSURLRequest上设置cachePolicy ,这里是文档 。

以下是关于一般caching如何工作的一些见解 。

您可以阅读有关可用于指定cachePolicy的具体枚举:

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

例如,你会做:

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

我得到的caching图像相同的url..所以我已经这样做了

 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) } } } 

}