iOS之Dispatch

一. 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ā)。大致的意思就跟下面這個圖一樣:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/3375220-d224a2f62dde6bb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容