【问题标题】:Swift: Runtime: Threading Issues: Data race in MyApp.DownloadManager.progress.setter : Swift.Float at 0x7b1400209130Swift:运行时:线程问题:MyApp.DownloadManager.progress.setter 中的数据竞争:Swift.Float 位于 0x7b1400209130
【发布时间】:2017-10-09 06:17:47
【问题描述】:

在我的应用程序中运行 ThreadSanitizer 时,我在并发下载文件时遇到了数据争用问题,如何解决它

这里是断点代码:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten:
    Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    if let downloadUrl = downloadTask.originalRequest?.url?.absoluteString,

        let download = activeDownloads[downloadUrl] {
       //break point indicate here:-
        download.progress = Float(totalBytesWritten)/Float(totalBytesExpectedToWrite)

        let totalSize = ByteCountFormatter.string(fromByteCount: totalBytesExpectedToWrite, countStyle: ByteCountFormatter.CountStyle.binary)

        DispatchQueue.main.async(execute: {
            if let trackIndex = self.trackIndexForDownloadTask(downloadTask), let trackCell = self.tableView.cellForRow(at: IndexPath(row: trackIndex, section: 0)) as? AmbientCell {

                trackCell.progressView.progress = Double(download.progress)
                if download.progress == 1.0 {
                 trackCell.progressView.isHidden = true
                 trackCell.downloadCompleted.isHidden = false
                }
             }
        })
    }
}

完整的警告日志 - ThreadSanitizer: data race

【问题讨论】:

    标签: ios swift multithreading xcode9


    【解决方案1】:

    看起来您有一个从两个线程同时使用的下载管理器,并且您在两个线程中设置它的进度,这导致了错误。 首先,为什么?如果您正在下载两个不同的文件,它们不应该共享进度。如果是同一个文件,真的应该同时下载吗? 在后一种情况下,您可能希望使用互斥锁来保护共享下载管理器。请注意,即使在这种情况下,您仍然可以使用非单调值更新进度。

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多