Browse Source

Merge pull request #2319 from onevcat/fix/duplicated-completion-call

Fix a potential duplicated completion invoking when task cancel
Wei Wang 1 year ago
parent
commit
6d8b529d5f

+ 4 - 1
Sources/Networking/SessionDataTask.swift

@@ -101,10 +101,13 @@ public class SessionDataTask: @unchecked Sendable {
         return nil
     }
     
-    func removeAllCallbacks() -> Void {
+    @discardableResult
+    func removeAllCallbacks() -> [TaskCallback] {
         lock.lock()
         defer { lock.unlock() }
+        let callbacks = callbacksStore.values
         callbacksStore.removeAll()
+        return Array(callbacks)
     }
 
     func resume() {

+ 2 - 1
Sources/Networking/SessionDelegate.swift

@@ -263,7 +263,8 @@ extension SessionDelegate: URLSessionDataDelegate {
         guard let sessionTask = self.task(for: task) else {
             return
         }
-        sessionTask.onTaskDone.call((result, sessionTask.callbacks))
+        let callbacks = sessionTask.removeAllCallbacks()
+        sessionTask.onTaskDone.call((result, callbacks))
         remove(sessionTask)
     }
 }