2016-11-17 99 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)同步。但有錯誤零。那是正確的方法嗎? –