為什麼 URLSessionTask 要呼叫 resume() 才會啟動 ?
當我們開發 iOS App,撰寫網路相關功能時,基本上可分為以下兩個步驟:
- 產生 URLSessionTask 物件。
- 從 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 繼續任務。