HTTP Request 一般都是非同步 (Asynchronous) 處理的。但有時候必須要同步 (Synchronous) 處理時,發現 URLSession
和 Alamofire 都沒有提供同步處理的方法。
既然它們只提供非同步的方法,那就只能將非同步的方法包裝成同步的方法。關鍵就在於,利用信號 (Semaphore) 來等待 HTTP Request 回來。
func syncRequest(_ url: String, method: Method) -> (Data?, Error?) { var data: Data? var error: Error? let url = URL(string: url)! var request = URLRequest(url: url) request.httpMethod = method.rawValue let semaphore = DispatchSemaphore(value: 0) let dataTask = URLSession.shared.dataTask(with: request) { data = $0 error = $2 semaphore.signal() } dataTask.resume() _ = semaphore.wait(timeout: .distantFuture) return (data, error) }