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

前端 未结 5 1342
有刺的猬
有刺的猬 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:29

    You can use this NSURLSession extension to add a synchronous method:

    extension NSURLSession {
        func synchronousDataTaskWithURL(url: NSURL) -> (NSData?, NSURLResponse?, NSError?) {
            var data: NSData?, response: NSURLResponse?, error: NSError?
    
            let semaphore = dispatch_semaphore_create(0)
    
            dataTaskWithURL(url) {
                data = $0; response = $1; error = $2
                dispatch_semaphore_signal(semaphore)
            }.resume()
    
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    
            return (data, response, error)
        }
    }
    

    Update for Swift 3:

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

提交回复
热议问题