Swift URLSession GET JSON with timeout
Swift
import Foundation
func fetchJSON(_ url: URL, timeout: TimeInterval = 10) throws -> Any {
var request = URLRequest(url: url)
request.timeoutInterval = timeout
let semaphore = DispatchSemaphore(value: 0)
var result: Result<Any, Error> = .failure(URLError(.unknown))
URLSession.shared.dataTask(with: request) { data, _, error in
defer { semaphore.signal() }
if let error { result = .failure(error); return }
guard let data else { result = .failure(URLError(.badServerResponse)); return }
result = Result { try JSONSerialization.jsonObject(with: data) }
}.resume()
guard semaphore.wait(timeout: .now() + timeout + 1) == .success else {
throw URLError(.timedOut)
}
return try result.get()
}