iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

Swift!從新手到微上手系列 第 26

Swift-GCD (Grand Central Dispatch)

今天開始要來介紹GCD,預計會講個兩三篇,哈哈

何謂GCD

GCD是蘋果開發的多線程編程,通過簡單的API就可以創建新線程去執行我們需要的程式碼。

GCD有兩種

  • 非同步(asynchronous)具備開啟新執行緒的能力,也具備跳過當前程式碼繼續往下執行的能力。

  • 同步(synchronous)不具備開啟新執行緒的能力,也不具備跳過當前程式碼繼續往下執行的能力。

GCD的優點

  • GCD是蘋果多核的並行運算提出的解決方案
  • GCD會自動利用更多的的CPU内核(比如雙核、四核)
  • GCD会自動管理線程的生命周期
  • 工程師只需要只要跟GCD說要執行什麼程式,不需要寫任何管理的程式碼

處理GCD時,會有三種Queue

Queue指的是執行程式碼的順序,採用FIFO(先進先出)的原則,執行順序從第一行開始。每一段程式碼執行完,才會進入下一段程式碼。

  1. Main Queue

Main Queue有最高優先級,並且在主線程上運行。所有UI更新都該在主線程上完成,如果沒有,在應用程式上會導致crashes。

  1. Global Queue

根據QOS(Quality of Service),此執行緒分為4種主要類型和一種默認類型,從最高順位到最低順位

1. userInteractive - 類似於主線程,工作是瞬時的
2. userInitiated - 運作時間只有幾秒鐘或更短
3. default- 系統會自行推斷出預設類型
4. utility - 運作需要幾秒到幾分
5. background - 運作需要大量時間,幾分鐘到幾小時

utility和background都應用於需要時間的繁重操作,以免阻塞主線程。使用GCD可以做同步或異步分配任務。同步就是在操作中不會執行其他程式碼,異步在操作中會執行其他程式碼(即是未完成)

  1. Custom Queue

自定義序列是可以自行創建並提供所需的任何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才會執行。


上一篇
Swift-Extensions
下一篇
Swift-MVC
系列文
Swift!從新手到微上手30

1 則留言

0
陳董粉絲
iT邦新手 5 級 ‧ 2019-10-17 15:21:44

說好的兩三篇呢

我要留言

立即登入留言