2014-06-20 40 views
27

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

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

这是我使用的电话:

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

谢谢!

+1

如果您拥有API服务器,您可能需要考虑修复此端的缓存标头。 URLSessionTasks应该服从标题,所以也许没有设置正确的东西。 –

回答

21

如果你的阅读@runmad您可以在流程图中可以看到,如果该文件的头部不变还是会用它的链接缓存版本,当你设置cachePolicy。

在Swift3我不得不这样做是为了得到它的工作:

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

let session = URLSession.init(configuration: config) 

这引起了该文件的一个真正的非缓存的版本,这是我所需要的带宽估计计算。

+0

这很奇怪,我会认为urlCache默认是零。 –

+0

自5小时以来一直在我的脑海里响起,感谢 –

+0

@VanDuTran从[URLCache文档](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410148-urlcache):“对于默认会话,默认会话值是共享的URL缓存对象。“这意味着如果你没有指定任何东西,那么它只会使用* shared * session提供的相同缓存。 – Honey

0

您需要在NSURLRequest上设置cachePolicy,这里是documentation

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

你可以阅读你可以使用指定特别的cachePolicyhere具体枚举:

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

例如,你会怎么做:

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

我正在使用NSURLSession。 –

32

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

@property (nonatomic, strong) NSURLSession *session; 

然后:

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

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

+0

这似乎不适用于我。至少不在iOS模拟器中。尝试关闭互联网连接,但它然后返回一个缓存的答复。请看看mu的问题http://stackoverflow.com/questions/30324394/prevent-nsurlsession-from-caching-responses – Sunkas

+2

我看到我们还需要将'URLCache'设置为'nil' – onmyway133

+0

我们可以** **做你写的或者只是将缓存设置为'nil'?或者我们*必须*包含'NSURLRequestReloadIgnoringLocalCacheData'?另外为什么不只是使用短暂的会话? – Honey

0

我正在高速图像相同的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) 

     } 
    } 
} 

}

3

下面的代码为我工作,美中不足的是设置Urlcache文件到零。

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

斯威夫特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() 
}