UI更新不适用于urlSession downloadTask didWriteData

时间:2017-10-29 11:50:59

标签: swift user-interface dispatch urlsession

目前,我在使用下载任务时遇到了用户界面更新的问题。以下函数应该更新用户界面,但它有时会起作用。为什么每次下载文件都不起作用?每次都会在调试器中显示NSLog的日志!

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
  let curDownloadSize = totalBytesWritten / (1024*1024)
  let totalDownloadSize = totalBytesExpectedToWrite / (1024*1024)

  if curDownloadSize != oldDownloadSize {
    DispatchQueue.main.async {
      self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
      self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
      NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
    }
  }
}

progressLabelprogressView目前都可用。

顺便说一下,我已经多次使用同一个文件对它进行了测试,有时它可以正常工作,有时则不然。

更新:我读到了使用像这样的第二个调度队列

DispatchQueue.global(qos: .utility).async {
  DispatchQueue.main.async {
    (same as above)
  }
}

但这有时也会起作用。

1 个答案:

答案 0 :(得分:0)

最近,我解决了这个问题。

如果将太多事件推送到主队列,则会出现此问题。它发生在一个非常好的互联网连接。在这种情况下,回调过于频繁。

我的解决方案:

progressCounter += 1
if progressCounter % 30 == 0 {
  DispatchQueue.main.async {
    self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
    self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
    NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
  }
}

progressCounter之前已初始化为0.