Procházet zdrojové kódy

Added syncResult extension to DispatchQueue to simplify thread-safe locking.

Christian Noon před 9 roky
rodič
revize
b56bd7d8c2

+ 6 - 0
Source/DispatchQueue+Alamofire.swift

@@ -33,4 +33,10 @@ extension DispatchQueue {
     func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
     func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
         asyncAfter(deadline: .now() + delay, execute: closure)
         asyncAfter(deadline: .now() + delay, execute: closure)
     }
     }
+
+    func syncResult<T>(_ closure: () -> T) -> T {
+        var result: T!
+        sync { result = closure() }
+        return result
+    }
 }
 }

+ 13 - 17
Source/Request.swift

@@ -335,15 +335,11 @@ open class DataRequest: Request {
         case request(URLRequest)
         case request(URLRequest)
 
 
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
-            var task: URLSessionTask!
-
             switch self {
             switch self {
             case let .request(urlRequest):
             case let .request(urlRequest):
                 let urlRequest = urlRequest.adapt(using: adapter)
                 let urlRequest = urlRequest.adapt(using: adapter)
-                queue.sync { task = session.dataTask(with: urlRequest) }
+                return queue.syncResult { session.dataTask(with: urlRequest) }
             }
             }
-
-            return task
         }
         }
     }
     }
 
 
@@ -415,14 +411,14 @@ open class DownloadRequest: Request {
         case resumeData(Data)
         case resumeData(Data)
 
 
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
-            var task: URLSessionTask!
+            let task: URLSessionTask
 
 
             switch self {
             switch self {
             case let .request(urlRequest):
             case let .request(urlRequest):
                 let urlRequest = urlRequest.adapt(using: adapter)
                 let urlRequest = urlRequest.adapt(using: adapter)
-                queue.sync { task = session.downloadTask(with: urlRequest) }
+                task = queue.syncResult { session.downloadTask(with: urlRequest) }
             case let .resumeData(resumeData):
             case let .resumeData(resumeData):
-                queue.sync { task = session.downloadTask(withResumeData: resumeData) }
+                task = queue.syncResult { session.downloadTask(withResumeData: resumeData) }
             }
             }
 
 
             return task
             return task
@@ -517,18 +513,18 @@ open class UploadRequest: DataRequest {
         case stream(InputStream, URLRequest)
         case stream(InputStream, URLRequest)
 
 
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
-            var task: URLSessionTask!
+            let task: URLSessionTask
 
 
             switch self {
             switch self {
             case let .data(data, urlRequest):
             case let .data(data, urlRequest):
                 let urlRequest = urlRequest.adapt(using: adapter)
                 let urlRequest = urlRequest.adapt(using: adapter)
-                queue.sync { task = session.uploadTask(with: urlRequest, from: data) }
+                task = queue.syncResult { session.uploadTask(with: urlRequest, from: data) }
             case let .file(url, urlRequest):
             case let .file(url, urlRequest):
                 let urlRequest = urlRequest.adapt(using: adapter)
                 let urlRequest = urlRequest.adapt(using: adapter)
-                queue.sync { task = session.uploadTask(with: urlRequest, fromFile: url) }
+                task = queue.syncResult { session.uploadTask(with: urlRequest, fromFile: url) }
             case let .stream(_, urlRequest):
             case let .stream(_, urlRequest):
                 let urlRequest = urlRequest.adapt(using: adapter)
                 let urlRequest = urlRequest.adapt(using: adapter)
-                queue.sync { task = session.uploadTask(withStreamedRequest: urlRequest) }
+                task = queue.syncResult { session.uploadTask(withStreamedRequest: urlRequest) }
             }
             }
 
 
             return task
             return task
@@ -588,18 +584,18 @@ open class StreamRequest: Request {
         case netService(NetService)
         case netService(NetService)
 
 
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
         func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) -> URLSessionTask {
-            var task: URLSessionTask!
+            let task: URLSessionTask
 
 
             switch self {
             switch self {
             case let .stream(hostName, port):
             case let .stream(hostName, port):
-                queue.sync { task = session.streamTask(withHostName: hostName, port: port) }
+                task = queue.syncResult { session.streamTask(withHostName: hostName, port: port) }
             case let .netService(netService):
             case let .netService(netService):
-                queue.sync { task = session.streamTask(with: netService) }
+                task = queue.syncResult { session.streamTask(with: netService) }
             }
             }
-            
+
             return task
             return task
         }
         }
     }
     }
 }
 }
-    
+
 #endif
 #endif

+ 1 - 2
Tests/ValidationTests.swift

@@ -240,8 +240,7 @@ class ContentTypeValidationTestCase: BaseTestCase {
                 let originalRequest = urlRequest.urlRequest
                 let originalRequest = urlRequest.urlRequest
                 let adaptedRequest = originalRequest.adapt(using: adapter)
                 let adaptedRequest = originalRequest.adapt(using: adapter)
 
 
-                var task: URLSessionDataTask!
-                queue.sync { task = self.session.dataTask(with: adaptedRequest) }
+                let task: URLSessionDataTask = queue.syncResult { session.dataTask(with: adaptedRequest) }
 
 
                 let originalTask = DataRequest.Requestable.request(originalRequest)
                 let originalTask = DataRequest.Requestable.request(originalRequest)
                 let request = MockRequest(session: session, task: task, originalTask: originalTask)
                 let request = MockRequest(session: session, task: task, originalTask: originalTask)