|
|
@@ -73,8 +73,9 @@ class SessionDelegate: NSObject {
|
|
|
// No other callbacks waiting, we can clear the task now.
|
|
|
if !task.containsCallbacks {
|
|
|
let dataTask = task.task
|
|
|
- dataTask.cancel()
|
|
|
- self.remove(dataTask)
|
|
|
+
|
|
|
+ self.cancelTask(dataTask)
|
|
|
+ self.remove(task)
|
|
|
}
|
|
|
}
|
|
|
let token = task.addCallback(callback)
|
|
|
@@ -82,6 +83,12 @@ class SessionDelegate: NSObject {
|
|
|
return DownloadTask(sessionTask: task, cancelToken: token)
|
|
|
}
|
|
|
|
|
|
+ private func cancelTask(_ dataTask: URLSessionDataTask) {
|
|
|
+ lock.lock()
|
|
|
+ defer { lock.unlock() }
|
|
|
+ dataTask.cancel()
|
|
|
+ }
|
|
|
+
|
|
|
func append(
|
|
|
_ task: SessionDataTask,
|
|
|
url: URL,
|
|
|
@@ -91,23 +98,23 @@ class SessionDelegate: NSObject {
|
|
|
return DownloadTask(sessionTask: task, cancelToken: token)
|
|
|
}
|
|
|
|
|
|
- private func remove(_ task: URLSessionTask) {
|
|
|
- guard let url = task.originalRequest?.url else {
|
|
|
+ private func remove(_ task: SessionDataTask) {
|
|
|
+ lock.lock()
|
|
|
+ defer { lock.unlock() }
|
|
|
+
|
|
|
+ guard let url = task.originalURL else {
|
|
|
return
|
|
|
}
|
|
|
- lock.lock()
|
|
|
- defer {lock.unlock()}
|
|
|
tasks[url] = nil
|
|
|
}
|
|
|
|
|
|
private func task(for task: URLSessionTask) -> SessionDataTask? {
|
|
|
+ lock.lock()
|
|
|
+ defer { lock.unlock() }
|
|
|
|
|
|
guard let url = task.originalRequest?.url else {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- lock.lock()
|
|
|
- defer { lock.unlock() }
|
|
|
guard let sessionTask = tasks[url] else {
|
|
|
return nil
|
|
|
}
|
|
|
@@ -182,7 +189,7 @@ extension SessionDelegate: URLSessionDataDelegate {
|
|
|
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
|
|
|
guard let sessionTask = self.task(for: task) else { return }
|
|
|
|
|
|
- if let url = task.originalRequest?.url {
|
|
|
+ if let url = sessionTask.originalURL {
|
|
|
let result: Result<URLResponse, KingfisherError>
|
|
|
if let error = error {
|
|
|
result = .failure(KingfisherError.responseError(reason: .URLSessionError(error: error)))
|
|
|
@@ -249,7 +256,7 @@ extension SessionDelegate: URLSessionDataDelegate {
|
|
|
guard let sessionTask = self.task(for: task) else {
|
|
|
return
|
|
|
}
|
|
|
- remove(task)
|
|
|
+ remove(sessionTask)
|
|
|
sessionTask.onTaskDone.call((result, sessionTask.callbacks))
|
|
|
}
|
|
|
}
|