【问题标题】:How to disable caching from NSURLSessionTask如何从 NSURLSessionTask 禁用缓存
【发布时间】:2014-08-11 06:45:59
【问题描述】:

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

这是因为缓存吗?我如何告诉NSURLSessionTask 不要使用缓存。

这是我使用的调用:

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

谢谢!

【问题讨论】:

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

标签: ios caching nsurlsessiontask


【解决方案1】:

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

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

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

let session = URLSession(configuration: config)

这得到了文件的真正非缓存版本,我需要它来进行带宽估计计算。

【讨论】:

  • 奇怪,我还以为urlCache默认是nil呢。
  • 自 5 小时以来一直在这个问题上打我的头,谢谢
  • @VanDuTran From URLCache documentation :“对于默认会话,默认值为共享 URL 缓存对象。”这意味着如果您不指定任何内容,那么它只会使用与 shared session 相同的缓存
  • 谢谢老哥,成功了。知道如何删除/禁用缓存“缓存”文件夹中的数据库文件吗?再次感谢您。
  • 我不知道出于某种原因,在我的会话数据任务完成处理程序中收到响应后不久,我仍然必须添加“URLCache.shared.removeAllCachedResponses()”。它现在不显示文件夹“fsCachedData”,这就是我想要的。
【解决方案2】:

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

@property (nonatomic, strong) NSURLSession *session;

然后:

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

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

【讨论】:

  • 这似乎对我不起作用。至少不在 iOS 模拟器中。尝试关闭互联网连接,但随后它返回缓存回复。请看mu问题stackoverflow.com/questions/30324394/…
  • 我看到我们还需要将URLCache设置为nil
  • 我们可以要么 做你写的或者只是将缓存设置为nil?或者我们必须包含NSURLRequestReloadIgnoringLocalCacheData?另外,为什么不使用临时会话?
  • 太棒了!你节省了我的时间!
【解决方案3】:

Swift 4 和 5

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

您也可以使用URLSession.ephemeral 配置属性,默认情况下不保存任何cookie 和缓存。

随着文档的进行,

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

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

let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)

【讨论】:

  • 在 Swift 5 中工作
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    下面的代码对我有用,问题是将 URLCache 设置为 nil。

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

    【讨论】:

      【解决方案6】:

      你需要在NSURLRequest上设置cachePolicy,这里是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];
      

      【讨论】:

      • 我正在使用 NSURLSession。
      【解决方案7】:

      我正在获取相同 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)
      
              }
          }
      }
      

      }

      【讨论】:

        【解决方案8】:

        使用http方法POST,如:

          var request = URLRequest(url: ulr)
          request.httpMethod = "POST"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-20
          • 2012-04-29
          • 2013-09-14
          • 2012-04-15
          • 2011-04-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多