以前に質問があったことは知っていますが、Swift 3 で URLSession を使用してリクエストを非同期にする方法に従う方がよいと主張するほとんどの回答に同意します。非同期リクエストを使用できない次のシナリオがあります。
Swift 3 とサーバー上で迅速に実行する機能には、次の問題があります。
- サーバー クライアントからのリクエストを受け取る
- リクエストを処理するには、サーバーは URL リクエストを送信し、レスポンスが到着するのを待つ必要があります。
- 応答が到着したら、それを処理してクライアントに返信します
問題はステップ 2 で発生します。ここで、URLSession は、非同期データ タスクのみを開始する機能を提供します。ほとんどの (すべてではないにしても) サーバー側の迅速な 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フレームワークの経験しかありませんが、これが問題に直面した場所です。同様の問題は、他のすべての迅速な Web フレームワークにも存在すると思います。