Procházet zdrojové kódy

Merge pull request #2327 from onevcat/fix/thread-issue

Fix a racing on data reading in session
Wei Wang před 1 rokem
rodič
revize
d4309a3ae3
1 změnil soubory, kde provedl 10 přidání a 3 odebrání
  1. 10 3
      Sources/Networking/SessionDataTask.swift

+ 10 - 3
Sources/Networking/SessionDataTask.swift

@@ -40,8 +40,13 @@ public class SessionDataTask: @unchecked Sendable {
         let options: KingfisherParsedOptionsInfo
     }
 
+    private var _mutableData: Data
     /// The downloaded raw data of the current task.
-    public private(set) var mutableData: Data
+    public var mutableData: Data {
+        lock.lock()
+        defer { lock.unlock() }
+        return _mutableData
+    }
 
     // This is a copy of `task.originalRequest?.url`. It is for obtaining race-safe behavior for a pitfall on iOS 13.
     // Ref: https://github.com/onevcat/Kingfisher/issues/1511
@@ -80,7 +85,7 @@ public class SessionDataTask: @unchecked Sendable {
     init(task: URLSessionDataTask) {
         self.task = task
         self.originalURL = task.originalRequest?.url
-        mutableData = Data()
+        _mutableData = Data()
     }
 
     func addCallback(_ callback: TaskCallback) -> CancelToken {
@@ -130,6 +135,8 @@ public class SessionDataTask: @unchecked Sendable {
     }
 
     func didReceiveData(_ data: Data) {
-        mutableData.append(data)
+        lock.lock()
+        defer { lock.unlock() }
+        _mutableData.append(data)
     }
 }