Browse Source

Add lock to fix thread racing

onevcat 7 years ago
parent
commit
8e67cae47a
1 changed files with 6 additions and 3 deletions
  1. 6 3
      Sources/Networking/SessionDelegate.swift

+ 6 - 3
Sources/Networking/SessionDelegate.swift

@@ -89,7 +89,7 @@ class SessionDelegate: NSObject {
         return DownloadTask(sessionTask: task, cancelToken: token)
     }
 
-    func remove(_ task: URLSessionTask, acquireLock: Bool) {
+    private func remove(_ task: URLSessionTask, acquireLock: Bool) {
         guard let url = task.originalRequest?.url else {
             return
         }
@@ -98,7 +98,7 @@ class SessionDelegate: NSObject {
         if acquireLock { lock.unlock() }
     }
 
-    func task(for task: URLSessionTask) -> SessionDataTask? {
+    private func task(for task: URLSessionTask) -> SessionDataTask? {
         guard let url = task.originalRequest?.url else {
             return nil
         }
@@ -112,6 +112,8 @@ class SessionDelegate: NSObject {
     }
 
     func task(for url: URL) -> SessionDataTask? {
+        lock.lock()
+        defer { lock.unlock() }
         return tasks[url]
     }
 
@@ -165,9 +167,10 @@ extension SessionDelegate: URLSessionDataDelegate {
         task.didReceiveData(data)
 
         if let expectedContentLength = dataTask.response?.expectedContentLength, expectedContentLength != -1 {
+            let dataLength = Int64(task.mutableData.count)
             DispatchQueue.main.async {
                 task.callbacks.forEach { callback in
-                    callback.onProgress?.call((Int64(task.mutableData.count), expectedContentLength))
+                    callback.onProgress?.call((dataLength, expectedContentLength))
                 }
             }
         }