From feb1e77424ca69f95d96e17df9239b43ac1c4a26 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 6 Apr 2024 18:20:48 -0700 Subject: [PATCH] Mark delegate methods as nonisolated to fix concurrency warning. Use MainActor.assumeIsolated because we did specify the main queue for these methods. --- Web/Sources/Web/DownloadSession.swift | 37 +++++++++++++++------------ 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Web/Sources/Web/DownloadSession.swift b/Web/Sources/Web/DownloadSession.swift index a22c39aab..2108cafc9 100755 --- a/Web/Sources/Web/DownloadSession.swift +++ b/Web/Sources/Web/DownloadSession.swift @@ -86,29 +86,34 @@ public protocol DownloadSessionDelegate { extension DownloadSession: URLSessionTaskDelegate { - public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { - tasksInProgress.remove(task) - - guard let info = infoForTask(task) else { - return - } - - info.error = error + nonisolated public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { - delegate.downloadSession(self, downloadDidCompleteForRepresentedObject: info.representedObject, response: info.urlResponse, data: info.data as Data, error: error as NSError?) { - self.removeTask(task) + MainActor.assumeIsolated { + tasksInProgress.remove(task) + + guard let info = infoForTask(task) else { + return + } + + info.error = error + + delegate.downloadSession(self, downloadDidCompleteForRepresentedObject: info.representedObject, response: info.urlResponse, data: info.data as Data, error: error as NSError?) { + self.removeTask(task) + } } } - public func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { + nonisolated public func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { - if response.statusCode == 301 || response.statusCode == 308 { - if let oldURLString = task.originalRequest?.url?.absoluteString, let newURLString = request.url?.absoluteString { - cacheRedirect(oldURLString, newURLString) + MainActor.assumeIsolated { + if response.statusCode == 301 || response.statusCode == 308 { + if let oldURLString = task.originalRequest?.url?.absoluteString, let newURLString = request.url?.absoluteString { + cacheRedirect(oldURLString, newURLString) + } } + + completionHandler(request) } - - completionHandler(request) } }