我知道之前已经问过这个问题并且我同意大多数答案,他们声称最好遵循Swift 3中与URLSession异步请求的方式。我有以下情况,其中不能使用异步请求。< / p>
使用Swift 3并且能够在服务器上运行swift我有以下问题。
问题出现在第2步中,其中URLSession使我们能够仅启动异步数据任务。大多数(如果不是全部)服务器端swift Web框架不支持异步响应。当请求到达服务器时,一切都必须在同步事件中完成,最后发送响应。
到目前为止,我找到的唯一解决方案是使用DispatchSemaphore(参见最后的示例),我不确定这是否适用于扩展环境。
任何帮助或想法都将不胜感激。
select ...
case
when (Age < 65) then
case
when (Income >= 0) or (Income <= 1880000) then
income * 52
when (other condition) then
--TODO: compute other condition amount - "calculate it amnt"
else
--TODO: compute amount here
end
else
--TODO: return right value here
end as amnt
...
from MyTable(s)
我只有kitura web框架的经验,这是我遇到问题的地方。我想在所有其他swift Web框架中都存在类似的问题。
答案 0 :(得分:2)
在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)
}
}
答案 1 :(得分:2)
你的三步问题可以通过使用完成处理程序来解决,即一个回调处理程序和一个Node.js约定:
import Foundation
import Kitura
import HeliumLogger
import LoggerAPI
let session = URLSession(configuration: URLSessionConfiguration.default)
Log.logger = HeliumLogger()
let router = Router()
router.get("/test") { req, res, next in
let datatask = session.dataTask(with: URL(string: "http://www.example.com")!) { data, urlResponse, error in
try! res.send(data: data!).end()
}
datatask.resume()
}
Kitura.addHTTPServer(onPort: 3000, with: router)
Kitura.run()
这是对您的问题的解决方案的快速演示,它绝不是遵循最佳的Swift / Kitura实践。但是,通过使用完成处理程序,我可以让我的Kitura应用程序进行HTTP调用以获取http://www.example.com
处的资源,等待响应,然后将结果发送回我应用程序的客户端。 / p>
指向相关API的链接:https://developer.apple.com/reference/foundation/urlsession/1410330-datatask