swift3 - 如何使用 swift 3 进行同步 url 请求

标签 swift3 alamofire vapor kitura

我知道之前有人问过这个问题,我同意大多数答案,这些答案声称最好遵循在 Swift 3 中使请求与 URLSession 异步的方式。我有以下场景,其中不能使用异步请求。

有了 Swift 3 和在服务器上快速运行的能力,我遇到了以下问题。

  1. 服务器接收来自客户端的请求
  2. 要处理请求,服务器必须发送 url 请求并等待响应到达。
  3. 一旦响应到达,处理它并回复客户端

问题出现在第 2 步,其中 URLSession 使我们能够仅启动异步数据任务。大多数(如果不是全部)服务器端 swift web 框架不支持异步响应。当请求到达服务器时,所有事情都必须以同步方式完成,并在最后发送响应。

到目前为止,我找到的唯一解决方案是使用 DispatchSemaphore(请参阅最后的示例),我不确定这是否适用于扩展环境。

如有任何帮助或想法,我们将不胜感激。

extension URLSession {
    func synchronousDataTaskWithURL(_ url: URL) -> (Data?, URLResponse?, Error?) {
        var data: Data?
        var response: URLResponse?
        var error: Error?

        let sem = DispatchSemaphore(value: 0)

        let task = self.dataTask(with: url as URL, completionHandler: {
            data = $0
            response = $1
            error = $2 as Error?
            sem.signal()
        })

        task.resume()

        let result = sem.wait(timeout: DispatchTime.distantFuture)
        switch result {
        case .success:
            return (data, response, error)
        case .timedOut:
            let error = URLSessionError(kind: URLSessionError.ErrorKind.timeout)
            return (data, response, error)

        }
    }
}

我只有 kitura web 框架的经验,这就是我遇到问题的地方。我想在所有其他 swift web 框架中都存在类似的问题。

最佳答案

在 Vapor 中,您可以使用 Droplet 的客户端进行同步请求。

let res = try drop.client.get("https://httpbin.org")
print(res)

此外,您可以使用 Portal 类使异步任务同步。

let res = try Portal.open { portal in
    asyncClient.get("https://httpbin.org") { res in
        portal.close(with: res)
    }
}

关于swift3 - 如何使用 swift 3 进行同步 url 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218815/

相关文章:

ios - 实时将 Metal MTKView 捕获为电影?

ios - 从另一个应用程序返回后,Alamofire(URL)请求失败,例如 : Facebook

mysql - Vapor 3 流利的 MySQL : save on model adds 10 to auto_increment

swift - 测试在 vapor 应用程序中不起作用

ios - Segue 在 iOS 中首次调用时非常慢

ios - 核心数据并发调试

ios - Swift - 大标题和搜索栏

swift - 如何实例化映射类? ( swift - alamofireObjectMapper)

ios - swift 3/ Alamofire 4 : Fetching data with the ID on a TableView

swift - Vapor - 如何为路由分配多个域?