【发布时间】:2016-10-24 12:45:17
【问题描述】:
我知道之前有人问过这个问题,并且我同意大多数声称最好遵循在 Swift 3 中与 URLSession 异步请求的方式。我有以下场景,其中无法使用异步请求。
使用 Swift 3 和在服务器上运行 swift 的能力我遇到了以下问题。
- 服务器接收来自客户端的请求
- 要处理请求,服务器必须发送一个 url 请求并等待响应到达。
- 响应到达后,对其进行处理并回复客户端
问题出现在第 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 框架中。
【问题讨论】:
标签: swift3 alamofire vapor kitura