http - 我能以某种方式通过 Swift 中的 NSURLSession 进行同步 HTTP 请求吗

标签 http swift httprequest nsurl

我可以通过 Swift 中的 NSURLSession 以某种方式进行同步 HTTP 请求吗?

我可以通过以下代码进行异步请求:

if let url = NSURL(string: "https://2ch.hk/b/threads.json") {
            let task = NSURLSession.sharedSession().dataTaskWithURL(url) {
                (data, response, error) in

                var jsonError: NSError?
                let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as [String: AnyObject]
                if jsonError != nil {
                    return
                }

                // ...
            }
            task.resume()
        }

但是同步请求呢?

最佳答案

您可以使用此 NSURLSession 扩展来添加同步方法:

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

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

关于http - 我能以某种方式通过 Swift 中的 NSURLSession 进行同步 HTTP 请求吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26784315/

相关文章:

ios - 你如何为 3D 触摸查看 Controller 制作 "title bar"

ios - 如何将值从一个函数传递到另一个函数?

ios - UITabbar 图像上下移动

c# - 'HttpRequest' 不包含 'Files' 的定义

php - Wget 自定义文件名

node.js - 跟踪和记录从 node.js 服务器内部发出的 http 调用

java - 使用 HttpURLConnection 的摘要认证

ruby - 用于编程的简单 Ruby http/curl API

java - 连接开销低的服务

android - Volley 错误 : Repeating a request when verbose logging is enabled fails