Can I somehow do a synchronous HTTP request via NSURLSession in Swift

前端 未结 5 1335
有刺的猬
有刺的猬 2020-11-29 01:01

Can I somehow do a synchronous HTTP request via NSURLSession in Swift?

I can do an asynchronous request via the following code:

if let u         


        
5条回答
  •  遥遥无期
    2020-11-29 01:24

    Updated one of the answers to use a URLRequest instead, so we can use PUT etc instead.

    extension URLSession {
        func synchronousDataTask(urlrequest: URLRequest) -> (data: Data?, response: URLResponse?, error: Error?) {
            var data: Data?
            var response: URLResponse?
            var error: Error?
    
            let semaphore = DispatchSemaphore(value: 0)
    
            let dataTask = self.dataTask(with: urlrequest) {
                data = $0
                response = $1
                error = $2
    
                semaphore.signal()
            }
            dataTask.resume()
    
            _ = semaphore.wait(timeout: .distantFuture)
    
            return (data, response, error)
        }
    }
    

    I'm calling like this.

    var request = URLRequest(url: url1)
    request.httpBody = body
    request.httpMethod = "PUT"
    let (_, _, error) = URLSession.shared.synchronousDataTask(urlrequest: request)
    if let error = error {
        print("Synchronous task ended with error: \(error)")
    }
    else {
        print("Synchronous task ended without errors.")
    }
    

提交回复
热议问题