何謂GCD
GCD是蘋果開發的多線程編程,通過簡單的API就可以創建新線程去執行我們需要的程式碼。
GCD有兩種
非同步(asynchronous)具備開啟新執行緒的能力,也具備跳過當前程式碼繼續往下執行的能力。
同步(synchronous)不具備開啟新執行緒的能力,也不具備跳過當前程式碼繼續往下執行的能力。
GCD的優點
處理GCD時,會有三種Queue
Queue指的是執行程式碼的順序,採用FIFO(先進先出)的原則,執行順序從第一行開始。每一段程式碼執行完,才會進入下一段程式碼。
Main Queue有最高優先級,並且在主線程上運行。所有UI更新都該在主線程上完成,如果沒有,在應用程式上會導致crashes。
根據QOS(Quality of Service),此執行緒分為4種主要類型和一種默認類型,從最高順位到最低順位
1. userInteractive - 類似於主線程,工作是瞬時的
2. userInitiated - 運作時間只有幾秒鐘或更短
3. default- 系統會自行推斷出預設類型
4. utility - 運作需要幾秒到幾分
5. background - 運作需要大量時間,幾分鐘到幾小時
utility和background都應用於需要時間的繁重操作,以免阻塞主線程。使用GCD可以做同步或異步分配任務。同步就是在操作中不會執行其他程式碼,異步在操作中會執行其他程式碼(即是未完成)
自定義序列是可以自行創建並提供所需的任何QOS的順序
實作Sync VS Async
DispatchQueue.global(qos: .userInitiated).async {
for i in 0...5 {
print("?,\(i)")
}
}
DispatchQueue.global(qos: .userInteractive).async {
for i in 0...5 {
print("?,\(i)")
}
}
//print
?,0
?,0
?,1
?,1
?,2
?,2
?,3
?,4
?,3
?,5
?,4
?,5
在上面的實例中,兩段程式都是async,表示他們是同時被執行。但userInteractive比userInitiated執行順序更優先,所以?會先被完成。
DispatchQueue.global(qos: .background).sync {
for i in 0...5 {
print("?,\(i)")
}
}
DispatchQueue.global(qos: .userInteractive).async {
for i in 0...5 {
print("?,\(i)")
}
}
//print
?,0
?,1
?,2
?,3
?,4
?,5
?,0
?,1
?,2
?,3
?,4
?,5
上述程式碼中,雖然userInteractive的優先順序更高,但還是會等到sync完成後async才會執行。