2017-10-09 16 views
0

在运行ThreadSanitizer在我的应用我有一个数据种族问题而并发下载的文件,该如何解决呢斯威夫特:运行时:线程问题:数据种族MyApp.DownloadManager.progress.setter:Swift.Float在0x7b1400209130

这里是断点代码:

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

回答

1

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