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)
}









