2016-11-17 62 views
1

嗨,我将在swift 3中为每个人创建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 
    } 
} 

我有Xcode建议我插入@escaping到函数。不知道能否执行正确

我也有在该行警告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

非常感谢。我们如何使用该功能?例如打印出数据然后执行另一个串行任务?异步函数是否正确使用@escaping? –

+0

URLSession已经有一个异步函数URLSession.shared.dataTask(与:,completionHandler:<(Data?,URLResponse?,Error?) - > Void>) –

+0

谢谢,所以我们可以使用默认的异步无需换行?我试着用let data = result.0 let stringData = String(data:data !,编码:.utf8)同步。但有错误零。那是正确的方法吗? –