一. GCD簡(jiǎn)述
GCD谈飒,全稱(chēng)是Grand Central Dispatch猾昆,是APPLE為多核編程提出的解決方法戳粒。GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程路狮、調(diào)度任務(wù)、銷(xiāo)毀線程)蔚约,GCD編程的兩個(gè)核心概念是:
- Dispatch Queue(隊(duì)列)
- 任務(wù): 任務(wù)是放在隊(duì)列中的Block中,然后Block由相應(yīng)的線程執(zhí)行涂籽。
1. 在GCD中苹祟,Dispatch Queue可分為下面三種類(lèi)型:
(1)main queue:主線程串行隊(duì)列,通過(guò)dispatch_get_main_queue()
獲得,這是一個(gè)與主線程相關(guān)的串行隊(duì)列树枫。
dispatch_queue_t mainQueue = dispatch_get_main_queue()```
(2)global queue:全局隊(duì)列是系統(tǒng)提供的一個(gè)隊(duì)列直焙,該隊(duì)列拿過(guò)來(lái)就能用,按執(zhí)行方式來(lái)說(shuō)砂轻,全局隊(duì)列應(yīng)該稱(chēng)得上是并行隊(duì)列奔誓。在獲取全局隊(duì)列的時(shí)候要知道其隊(duì)列的優(yōu)先級(jí),通常情況下搔涝,優(yōu)先級(jí)越高的隊(duì)列就越先執(zhí)行厨喂。
dispatch_queue_t globalQueue = dispatch_get_global_queue(priority, 0)
- parameter priority:
DISPATCH_QUEUE_PRIORITY_HIGH //高
DISPATCH_QUEUE_PRIORITY_DEFAULT //默認(rèn)
DISPATCH_QUEUE_PRIORITY_LOW //低
DISPATCH_QUEUE_PRIORITY_BACKGROUND //后臺(tái)
(3)用戶(hù)隊(duì)列:通過(guò)函數(shù)`dispatch_queue_create()`手動(dòng)創(chuàng)建的串行隊(duì)列或并行隊(duì)列,手動(dòng)創(chuàng)建需要收到釋放庄呈。
dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) // 隊(duì)列名稱(chēng)蜕煌, 隊(duì)列類(lèi)型(串行、并行)
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT) // 創(chuàng)建并行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL) // 創(chuàng)建串行隊(duì)列
dispatch_release(queue) // 由dispatch_queue_create方法生成的Dispatch Queue并不能由ARC來(lái)自動(dòng)管理內(nèi)存诬留,需手動(dòng)釋放隊(duì)列
## 2.GCD中一些系統(tǒng)提供的常用dispatch方法
(1)dispatch_sync 和 dispatch_async 同步和異步執(zhí)行操作
dispatch_sync(queue, block) //提交block給指定queue進(jìn)行同步執(zhí)行
dispatch_async(queue, block) //提交block給指定queue進(jìn)行異步執(zhí)行
dispatch_async() 調(diào)用以后立即返回不會(huì)阻塞當(dāng)前線程繼續(xù)執(zhí)行斜纪,dispatch_sync() 調(diào)用以后等到block執(zhí)行完以后才返回,dispatch_sync()會(huì)阻塞當(dāng)前線程文兑,關(guān)于同步和異步后面會(huì)詳細(xì)介紹盒刚。
(2)dispatch_after 延時(shí)添加到隊(duì)列
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秒之后添加到隊(duì)列")
})
(3)dispatch_barrier_async 等待在dispatch_barrier_async之前加入隊(duì)列的任務(wù)全部執(zhí)行完成之后,再執(zhí)行dispatch_barrier_async中的任務(wù)
dispatch_barrier_async(conCurrentQueue, ^{
NSLog(@"dispatch barrier")
})
假設(shè)我們?cè)扔?個(gè)任務(wù)要執(zhí)行绿贞,我們現(xiàn)在要插入一個(gè)任務(wù)0因块,這個(gè)任務(wù)0要在1、2樟蠕、3都并發(fā)執(zhí)行完了之后才能執(zhí)行贮聂,而4、5寨辩、6號(hào)任務(wù)要在這個(gè)任務(wù)0結(jié)束后才允許并發(fā)吓懈。大致的意思就跟下面這個(gè)圖一樣:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/3375220-d224a2f62dde6bb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)