Я знаю, что этот вопрос задавался раньше, и я согласен с большинством ответов, в которых утверждается, что лучше следить за тем, как запросы выполняются асинхронно с URLSession в Swift 3. У меня есть следующий сценарий, где асинхронный запрос не может использоваться.
Со Swift 3 и возможностью быстрой работы на серверах у меня возникает следующая проблема.
- Сервер получает запрос от клиента
- Чтобы обработать запрос, сервер должен отправить запрос URL и дождаться получения ответа.
- После получения ответа обработайте его и ответьте клиенту.
Проблема возникает на шаге 2, где URLSession дает нам возможность инициировать только задачу асинхронных данных. Большинство (если не все) серверных быстрых веб-фреймворков не поддерживают асинхронные ответы. Когда запрос поступает на сервер, все должно выполняться синхронно и в конце отправлять ответ.
Единственное решение, которое я нашел до сих пор, - это использование 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, и именно здесь я столкнулся с проблемой. Я полагаю, что подобные проблемы существуют и во всех других быстрых веб-фреймворках.