iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Mobile Development

如何成為IOS初級工程師系列 第 23

Day-23 多人分工的重要性 - 多執行緒(GCD)

  • 分享至 

  • xImage
  •  

在APP的功能中,有些任務在執行時需要花費較多的時間,像是大量下載圖片的時候,因為主執行緒(Main thread)主要是處理畫面更新的,如果主執行緒的其中一個任務要花非常多時間的話(像是網路相關動作、資料庫與檔案操作等等),就會造成畫面無法更新而卡住。所以這時候我們就需要其他執行緒來做處理。

進入正題

今天會介紹

  • Queue
  • Global Queue
  • Async
  • 同步、非同步

GCD

簡單介紹一下工作原理,我們可以任意將任務派給任意執行緒中,而其他沒有指定派給誰的任務就都會交給主執行緒去處理。非同步,我們拆解成queue與async來說明

Queue

Queue指的是執行程式碼的順序,採用FIFO(先進先出)的原則。主要分為main queueglobal queue,還有一種Custom Queue但我們今天不會講到。main queue的任務會在主執行緒執行,global queue的任務會在背景執行任務,下方是簡單宣告方式。

let mainQueue = DispatchQueue.main        //主執行緒
let secondQueue = DispatchQueue.global()  //global queue

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任務完成時要執行的任務
		//所有非同步任務完成後要做的程式碼            
}

Async

先了解一下什麼是同步跟非同步

同步(Sync)

簡單來說兩個不同執行緒的任務時間長短不一樣,但是先做完的要等其他還沒完成任務的執行緒做完後,才可以接新的任務。

非同步(Async)

不同的執行緒各做各的任務,彼此之間沒有任何關係。所以假設如果要背景執行完後顯示於畫面上,則必須要將執行結果傳至主主行緒上顯示。下方是簡單示範程式碼

secondQueue.async{
	//任務程式碼,在背景執行程式
	mainQueue.async{
		//回到主執行緒執行
	}
}

想更深入了解的話可以看看這篇文章,我覺得講得不錯


上一篇
Day-22 單例模式 - Singleton
下一篇
Day-24 幫你取得資料的工具人 - API
系列文
如何成為IOS初級工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言