為什麼 URLSessionTask 要呼叫 resume() 才會啟動 ?

當我們開發 iOS App,撰寫網路相關功能時,基本上可分為以下兩個步驟:

  1. 產生 URLSessionTask 物件。
  2. 從 URLSessionTask 物件呼叫 resume(),開始下載或上傳資料。

比方以下例子:

let urlStr = "https://wakelandtheatre.files.wordpress.com/2013/11/final-poster.jpg"if let url = URL(string: urlStr) {   let task = URLSession.shared.dataTask(with: url) { (data, response, error) in      if let data = data {      }   }}task.resume()

其中有個關鍵,我們一定要記得呼叫 resume(),不然 URLSessionTask 是不會開始下載或上傳資料的。因此程式執行的順利將是 resume() 開始任務,然後等任務完成時,才會執行當初產生 task 時傳入的 closure { } 程式碼。

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in   if let data = data {   }}

我們可以把產生 URLSessionTask 物件想成產生一個下載或上傳資料的任務。但它只是產生任務,並不代表任務開始執行,要等呼叫 resume 才會開始執行。這就好像不可能的任務的主角伊森·韓特,時常有人給他不可能的任務,但他只是先接收任務,並不會馬上執行。要等美麗的女主角出現時,才會開始執行。

讓我們再仔細看一下 function resume。resume 的意思是(中斷後)繼續,重新開始,這點滿令人疑惑的。為何開始任務的 function 名稱不取名叫 start,而要叫 resume 呢 ? 明明任務才剛產生,為何要繼續啟動它呢 ?

答案就藏在 Apple 官方的 resume() 說明文件裡。

Newly-initialized tasks begin in a suspended state, so you need to call this method to start the task.

Apple 提到剛產生的 task 將處在暫停的狀態(suspended state),因此我們必須呼叫 resume() 來啟動它。

其實 URLSessionTask 很厲害,它還可以隨時呼叫 cancel 和 suspend 來取消或暫停任務(比方下載檔案時下載到一半暫停)。因此 function resume 很方便,不管 task 是剛產生還是執行到一半暫停中,我們都可以呼叫 resume 繼續任務。

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store