Jelajahi Sumber

Makes lock behavior in session delegate more stable

onevcat 7 tahun lalu
induk
melakukan
e5118d4eef
1 mengubah file dengan 12 tambahan dan 16 penghapusan
  1. 12 16
      Sources/Networking/SessionDelegate.swift

+ 12 - 16
Sources/Networking/SessionDelegate.swift

@@ -83,8 +83,6 @@ class SessionDelegate: NSObject {
         url: URL,
         callback: SessionDataTask.TaskCallback) -> DownloadTask
     {
-        lock.lock()
-        defer { lock.unlock() }
         let token = task.addCallback(callback)
         return DownloadTask(sessionTask: task, cancelToken: token)
     }
@@ -93,12 +91,16 @@ class SessionDelegate: NSObject {
         guard let url = task.originalRequest?.url else {
             return
         }
-        if acquireLock { lock.lock() }
+        lock.lock()
+        defer {lock.unlock()}
         tasks[url] = nil
-        if acquireLock { lock.unlock() }
     }
 
     private func task(for task: URLSessionTask) -> SessionDataTask? {
+
+        lock.lock()
+        defer { lock.unlock() }
+
         guard let url = task.originalRequest?.url else {
             return nil
         }
@@ -118,13 +120,18 @@ class SessionDelegate: NSObject {
     }
 
     func cancelAll() {
-        for task in tasks.values {
+        lock.lock()
+        let taskValues = tasks.values
+        lock.unlock()
+        for task in taskValues {
             task.forceCancel()
         }
     }
 
     func cancel(url: URL) {
+        lock.lock()
         let task = tasks[url]
+        lock.unlock()
         task?.forceCancel()
     }
 }
@@ -137,9 +144,6 @@ extension SessionDelegate: URLSessionDataDelegate {
         didReceive response: URLResponse,
         completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)
     {
-        lock.lock()
-        defer { lock.unlock() }
-
         guard let httpResponse = response as? HTTPURLResponse else {
             let error = KingfisherError.responseError(reason: .invalidURLResponse(response: response))
             onCompleted(task: dataTask, result: .failure(error))
@@ -158,9 +162,6 @@ extension SessionDelegate: URLSessionDataDelegate {
     }
 
     func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
-        lock.lock()
-        defer { lock.unlock() }
-
         guard let task = self.task(for: dataTask) else {
             return
         }
@@ -177,9 +178,6 @@ extension SessionDelegate: URLSessionDataDelegate {
     }
 
     func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
-        lock.lock()
-        defer { lock.unlock() }
-
         guard let sessionTask = self.task(for: task) else { return }
 
         if let url = task.originalRequest?.url {
@@ -231,8 +229,6 @@ extension SessionDelegate: URLSessionDataDelegate {
         newRequest request: URLRequest,
         completionHandler: @escaping (URLRequest?) -> Void)
     {
-        lock.lock()
-        defer { lock.unlock() }
         guard let sessionDataTask = self.task(for: task),
               let redirectHandler = Array(sessionDataTask.callbacks).last?.options.redirectHandler else
         {