2016-11-17 27 views
1

こんにちはすべて私はURLSessionの拡張機能を迅速に作成して、同期および非同期リクエストを作成しようとしています。ここに私の実装ですIOS Swift 3同期および非同期リクエストのURLSession拡張を作成

extension URLSession { 
    func sendSynchronousRequest(request: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) { 
     let semaphore = DispatchSemaphore(value: 0) 

     let task = self.dataTask(with: request) { (data, response, error) in 
      completionHandler(data,response,error) 
      semaphore.signal() 
     } 
     task.resume() 
     semaphore.wait(timeout: .distantFuture) 
    } 

    func sendAsynchronousRequest(request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask { 
     let task = self.dataTask(with: request) { data, response, error in 
      completionHandler(data, response, error) 
     } 
     task.resume() 
     return task 
    } 
} 

私は関数に@エスケープを挿入することをお勧めします。実装が正しいかどうか分からないのです

私も enter image description here

誰でも拡張子を修正する方法を知って、この行で警告している

?ヘルプは非常に感謝しています!ありがとう!

答えて

9

この実装が見つかりましたが、swift1/2では覚えがたいです。これは私のものではありません。しかし、swift3で書き直しました。私はそれを見つけた場所を覚えていない:/

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

    let semaphore = DispatchSemaphore(value: 0) 

    dataTask(with: url) { 
     data = $0; response = $1; error = $2 
     semaphore.signal() 
     }.resume() 

    semaphore.wait() 

    return (data, response, error) 
} 
+0

ありがとう。どのように機能を使うことができますか?例えば、データを印刷して、別のシリアルタスクを実行するなどです。 @エスケープすると非同期関数は正しいですか? –

+0

URLSessionには既に非同期機能のURLSession.shared.dataTaskがあります(、completionHandler:<(データ?, URLResponse ?, Error?)> Void>) –

+0

ありがとうございます。私はlet data = result.0で同期を使用しようとしました。 let stringData = String(data:data!、encoding:.utf8)。エラーはありません。それは正しい方法ですか? –

関連する問題