一. GCD簡述
GCD,全稱是Grand Central Dispatch,是APPLE為多核編程提出的解決方法。GCD會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程),GCD編程的兩個核心概念是:
- Dispatch Queue(隊列)
- 任務(wù): 任務(wù)是放在隊列中的Block中,然后Block由相應(yīng)的線程執(zhí)行。
1. 在GCD中,Dispatch Queue可分為下面三種類型:
(1)main queue:主線程串行隊列,通過dispatch_get_main_queue() 獲得,這是一個與主線程相關(guān)的串行隊列。
dispatch_queue_t mainQueue = dispatch_get_main_queue()```
(2)global queue:全局隊列是系統(tǒng)提供的一個隊列,該隊列拿過來就能用,按執(zhí)行方式來說,全局隊列應(yīng)該稱得上是并行隊列。在獲取全局隊列的時候要知道其隊列的優(yōu)先級,通常情況下,優(yōu)先級越高的隊列就越先執(zhí)行。
dispatch_queue_t globalQueue = dispatch_get_global_queue(priority, 0)
- parameter priority:
DISPATCH_QUEUE_PRIORITY_HIGH //高
DISPATCH_QUEUE_PRIORITY_DEFAULT //默認
DISPATCH_QUEUE_PRIORITY_LOW //低
DISPATCH_QUEUE_PRIORITY_BACKGROUND //后臺
(3)用戶隊列:通過函數(shù)`dispatch_queue_create()`手動創(chuàng)建的串行隊列或并行隊列,手動創(chuàng)建需要收到釋放。
dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) // 隊列名稱, 隊列類型(串行、并行)
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT) // 創(chuàng)建并行隊列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL) // 創(chuàng)建串行隊列
dispatch_release(queue) // 由dispatch_queue_create方法生成的Dispatch Queue并不能由ARC來自動管理內(nèi)存,需手動釋放隊列
## 2.GCD中一些系統(tǒng)提供的常用dispatch方法
(1)dispatch_sync 和 dispatch_async 同步和異步執(zhí)行操作
dispatch_sync(queue, block) //提交block給指定queue進行同步執(zhí)行
dispatch_async(queue, block) //提交block給指定queue進行異步執(zhí)行
dispatch_async() 調(diào)用以后立即返回不會阻塞當(dāng)前線程繼續(xù)執(zhí)行,dispatch_sync() 調(diào)用以后等到block執(zhí)行完以后才返回,dispatch_sync()會阻塞當(dāng)前線程,關(guān)于同步和異步后面會詳細介紹。
(2)dispatch_after 延時添加到隊列
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC)
dispatch_queue_t mainQueue = dispatch_get_main_queue()
dispatch_after(delayTime, mainQueue, ^{
NSLog(@"3秒之后添加到隊列")
})
(3)dispatch_barrier_async 等待在dispatch_barrier_async之前加入隊列的任務(wù)全部執(zhí)行完成之后,再執(zhí)行dispatch_barrier_async中的任務(wù)
dispatch_barrier_async(conCurrentQueue, ^{
NSLog(@"dispatch barrier")
})
假設(shè)我們原先有6個任務(wù)要執(zhí)行,我們現(xiàn)在要插入一個任務(wù)0,這個任務(wù)0要在1、2、3都并發(fā)執(zhí)行完了之后才能執(zhí)行,而4、5、6號任務(wù)要在這個任務(wù)0結(jié)束后才允許并發(fā)。大致的意思就跟下面這個圖一樣:
