在APP的功能中,有些任務在執行時需要花費較多的時間,像是大量下載圖片的時候,因為主執行緒(Main thread)主要是處理畫面更新的,如果主執行緒的其中一個任務要花非常多時間的話(像是網路相關動作、資料庫與檔案操作等等),就會造成畫面無法更新而卡住。所以這時候我們就需要其他執行緒來做處理。
今天會介紹
簡單介紹一下工作原理,我們可以任意將任務派給任意執行緒中,而其他沒有指定派給誰的任務就都會交給主執行緒去處理。非同步,我們拆解成queue與async來說明
Queue指的是執行程式碼的順序,採用FIFO(先進先出)的原則。主要分為main queue
與global queue
,還有一種Custom Queue
但我們今天不會講到。main queue的任務會在主執行緒執行,global queue的任務會在背景執行任務,下方是簡單宣告方式。
let mainQueue = DispatchQueue.main //主執行緒
let secondQueue = DispatchQueue.global() //global queue
當我們需要追蹤多個非同步的任務是否已經執行完成,才可以繼續進行下個任務,這時候就可以使用Group Queue。
以下我們簡單用程式碼介紹如何建立。
let group = DispatchGroup() //初始化建立一個group queue
let secondQueue = DispatchQueue.global() //設定非同步任務任務
secondQueue.async(group: group){
//要做的任務程式碼
}
let mainQueue = DispatchQueue.main
grouop.notify(group: group){ //所有group任務完成時要執行的任務
//所有非同步任務完成後要做的程式碼
}
先了解一下什麼是同步跟非同步
簡單來說兩個不同執行緒的任務時間長短不一樣,但是先做完的要等其他還沒完成任務的執行緒做完後,才可以接新的任務。
不同的執行緒各做各的任務,彼此之間沒有任何關係。所以假設如果要背景執行完後顯示於畫面上,則必須要將執行結果傳至主主行緒上顯示。下方是簡單示範程式碼
secondQueue.async{
//任務程式碼,在背景執行程式
mainQueue.async{
//回到主執行緒執行
}
}
想更深入了解的話可以看看這篇文章,我覺得講得不錯