|
|
@@ -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
|
|
|
{
|