GCD (Grand Central Dispatch) :iOS4 開始引入,使用更加方便,程序員只需要將任務(wù)添加到Dispatch Queues 中即可。
Dispatch Queues 中的任務(wù)按照FIFO的順序進(jìn)行處理,并且,由于加入任務(wù)的方式不同,執(zhí)行分為同步/異步。
Dispatch Groups 可以幫助我們處理如何判斷多線程全部執(zhí)行結(jié)束的問(wèn)題
Dispatch Semaphores 幫助我們控制多任務(wù)對(duì)有限數(shù)量資源的訪問(wèn)
Dispatch Objects 幫助我們對(duì)線程隊(duì)列進(jìn)行更加細(xì)致的控制(掛起、恢復(fù)、取消、激活等操作)
Dispatch Once 可以幫助我們確保某個(gè)函數(shù)只執(zhí)行一次,可用于單例的實(shí)現(xiàn)
下面針對(duì)以上內(nèi)容給出示例代碼
1.串行隊(duì)列,每次只執(zhí)行一個(gè)任務(wù),無(wú)論用什么方式加入任務(wù)。
//為了清楚表示可以寫為DISPATCH_QUEUE_SERIAL,iOS官方文檔定義的DISPATCH_QUEUE_SERIAL就是NULL
使用串行隊(duì)列,任務(wù)都是挨個(gè)執(zhí)行,每次只運(yùn)行一個(gè)。
dispatch_queue_t serialQueue=dispatch_queue_create("串行隊(duì)列", NULL);
dispatch_sync(serialQueue, ^(){
NSLog(@“同步加入任務(wù)-------%@“,[NSThread currentThread]);
});
dispatch_async(serialQueue, ^(){
NSLog(@“異步加入任務(wù)——%@“,[NSThread currentThread]);
});
2.并行隊(duì)列,每次執(zhí)行多個(gè)任務(wù)
dispatch_queue_t concurrentQueue = dispatch_queue_create(“并行隊(duì)列”, DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(concurrentQueue, ^(){
NSLog(@“同步加入任務(wù)-------%@“,[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^(){
NSLog(@“異步加入任務(wù)——%@“,[NSThread currentThread]);
});
3.用Dispatch Groups實(shí)現(xiàn)判斷多線程全部執(zhí)行結(jié)束
// 獲取全局隊(duì)列,全局隊(duì)列是系統(tǒng)提供的并行隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// 添加隊(duì)列到組中
dispatch_group_async(group, queue, ^{
NSLog(@"11111111111");
});
dispatch_group_async(group, queue, ^{
NSLog(@"22222222222");
});
dispatch_group_async(group, queue, ^{
NSLog(@"33333333");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@“以上執(zhí)行完成后才執(zhí)行這里?。?!”);
});
也可以使用dispatch_group_wait來(lái)完成此功能,但是他會(huì)阻塞當(dāng)前線程
4.只執(zhí)行某個(gè)函數(shù)一次
static dispatch_once_t onceToken;
for(int i=0;i<5;i++)
{
dispatch_once(&onceToken, ^{
NSLog(@"only once");
});
}
5.信號(hào)量
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
for (int index = 0; index < 10; index++) {
dispatch_async(queue, ^(){
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@“信號(hào)量資源就一個(gè),按順序執(zhí)行 :%d", index);
if(index==5)
{
[NSThread sleepForTimeInterval:3];
}
dispatch_semaphore_signal(semaphore);
});
}
6.隊(duì)列的掛起、恢復(fù)
dispatch_queue_t myQueue;
myQueue = dispatch_queue_create(“隊(duì)列”, NULL);
//掛起隊(duì)列
dispatch_sync(myQueue, ^(){
NSLog(@“掛起任務(wù)之前“);
});
dispatch_suspend(myQueue);
dispatch_sync(myQueue, ^(){
NSLog(@“掛起任務(wù)之后“);
});
//恢復(fù)隊(duì)列
dispatch_resume(myQueue);
*****
*****
*****
*****
下面是對(duì)GCD API的一些整理,錯(cuò)誤指出還請(qǐng)批評(píng)指正
/******************************************************dispatch—queue****************************************************/
/*
功能:將塊函數(shù)添加到線程隊(duì)列中異步執(zhí)行(異步:執(zhí)行后不管結(jié)果直接返回)
參數(shù):queue:指定的隊(duì)列 block/work 塊函數(shù)(context:傳入block塊函數(shù)中的參數(shù))
返回值:空
*/
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:將塊函數(shù)添加到線程隊(duì)列中同步執(zhí)行(異步:執(zhí)行完成后返回結(jié)果)
參數(shù):queue:指定的隊(duì)列 block/work 塊函數(shù)(context:傳入block塊函數(shù)中的參數(shù))
返回值:空
*/
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:將塊函數(shù)添加到線程隊(duì)列中按照迭代次數(shù)執(zhí)行,所有迭代完成后返回結(jié)果
參數(shù):iterations:迭代次數(shù) queue:指定的隊(duì)列 block/work 塊函數(shù)(context:傳入block塊函數(shù)中的參數(shù))
返回值:空
*/
void dispatch_apply(size_t iterations, dispatch_queue_t queue,
DISPATCH_NOESCAPE void (^block)(size_t));
dispatch_apply_f(size_t iterations, dispatch_queue_t queue,
void *_Nullable context,
void (*work)(void *_Nullable, size_t));
/*
功能:獲取當(dāng)前執(zhí)行中的隊(duì)列
參數(shù):無(wú)
返回值:當(dāng)前隊(duì)列或者空
*/
dispatch_queue_t dispatch_get_current_queue(void);
/*
功能:獲取主隊(duì)列
參數(shù):無(wú)
返回值:主隊(duì)列或者空
*/
dispatch_queue_t dispatch_get_main_queue(void)
{
return DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q);
}
/*
功能:獲取全局并發(fā)隊(duì)列
參數(shù):identifier:隊(duì)列優(yōu)先級(jí) typedef long dispatch_queue_priority_t;
- DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
- DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
- DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
- DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
flags:保留供將來(lái)使用,輸入除了0以外的任何值可能返回空值
返回值:全局隊(duì)列或者空
*/
dispatch_queue_t dispatch_get_global_queue(long identifier, unsigned long flags);
#define DISPATCH_QUEUE_SERIAL NULL //串行隊(duì)列
#define DISPATCH_QUEUE_SERIAL_INACTIVE//暫停狀態(tài)串行隊(duì)列
dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_SERIAL)
#define DISPATCH_QUEUE_CONCURRENT //并發(fā)隊(duì)列
DISPATCH_GLOBAL_OBJECT(dispatch_queue_attr_t, _dispatch_queue_attr_concurrent)
#define DISPATCH_QUEUE_CONCURRENT_INACTIVE //暫停狀態(tài)并發(fā)隊(duì)列
dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_CONCURRENT)
/*
功能:設(shè)置屬性值,用于在隊(duì)列的創(chuàng)建時(shí)加入
參數(shù):attr:隊(duì)列屬性值
返回值:隊(duì)列屬性值
*/
dispatch_queue_attr_t dispatch_queue_attr_make_initially_inactive(
dispatch_queue_attr_t _Nullable attr);
#define DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL
dispatch_queue_attr_make_with_autorelease_frequency(
DISPATCH_QUEUE_SERIAL, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM)
#define DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL
dispatch_queue_attr_make_with_autorelease_frequency(
DISPATCH_QUEUE_CONCURRENT, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM)
dispatch_queue_attr_t dispatch_queue_attr_make_with_autorelease_frequency(
dispatch_queue_attr_t _Nullable attr, dispatch_autorelease_frequency_t frequency);
/*
功能:創(chuàng)建隊(duì)列
參數(shù):label:隊(duì)列附帶信息,可有可無(wú) attr:隊(duì)列屬性值 target:目標(biāo)隊(duì)列,相當(dāng)于目標(biāo)隊(duì)列計(jì)數(shù)加一
返回值:引用的隊(duì)列
*/
dispatch_queue_t dispatch_queue_create(const char *_Nullable label,
dispatch_queue_attr_t _Nullable attr);
dispatch_queue_t dispatch_queue_create_with_target(const char *_Nullable label,
dispatch_queue_attr_t _Nullable attr, dispatch_queue_t _Nullable target)
/*
功能:獲取隊(duì)列描述信息
參數(shù):label:隊(duì)列附帶信息,可有可無(wú) attr:隊(duì)列屬性值 target:目標(biāo)隊(duì)列,相當(dāng)于目標(biāo)隊(duì)列計(jì)數(shù)加一
返回值:隊(duì)列附帶信息
*/
const char *dispatch_queue_get_label(dispatch_queue_t _Nullable queue);
//dispatch_qos_class_t dispatch_queue_get_qos_class(dispatch_queue_t queue,
int *_Nullable relative_priority_ptr);
/*
功能:給指定對(duì)象設(shè)置目標(biāo)隊(duì)列
參數(shù):object:目標(biāo)對(duì)象 queue:目標(biāo)隊(duì)列
返回值:無(wú)
*/
void dispatch_set_target_queue(dispatch_object_t object,
dispatch_queue_t _Nullable queue);
/*
功能:dispatch類入口函數(shù)
參數(shù):無(wú)
返回值:無(wú)
*/
void dispatch_main(void);
/*
功能:在指定時(shí)間后再目標(biāo)隊(duì)列執(zhí)行block任務(wù)
參數(shù):when:時(shí)間 queue:目標(biāo)隊(duì)列 block/work:要執(zhí)行的任務(wù) context:傳入任務(wù)中的參數(shù)
返回值:無(wú)
*/
void dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
void dispatch_after_f(dispatch_time_t when,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:給指定隊(duì)列增加一個(gè)阻塞其它異步執(zhí)行任務(wù)的任務(wù)
參數(shù):queue:隊(duì)列 block/work:任務(wù) context:傳入任務(wù)的參數(shù)
返回值:無(wú)
*/
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_barrier_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:給指定隊(duì)列增加一個(gè)阻塞其它同步執(zhí)行任務(wù)的任務(wù)
參數(shù):queue:隊(duì)列 block/work:任務(wù) context:傳入任務(wù)的參數(shù)
返回值:無(wú)
*/
void dispatch_barrier_sync(dispatch_queue_t queue,
DISPATCH_NOESCAPE dispatch_block_t block);
void dispatch_barrier_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:當(dāng)指定隊(duì)列鍵值改變時(shí),或者是所有屬性值都釋放后,調(diào)用銷毀函數(shù)destructor
參數(shù):queue:隊(duì)列 key:鍵名 context:新內(nèi)容 destructor:銷毀函數(shù)
返回值:無(wú)
*/
void dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
void *_Nullable context, dispatch_function_t _Nullable destructor);
/*
功能:獲取指定隊(duì)列特定鍵內(nèi)容
參數(shù):queue:隊(duì)列 key:鍵名
返回值:鍵值
*/
void *_Nullable dispatch_queue_get_specific(dispatch_queue_t queue, const void *key);
/*
功能:獲取當(dāng)前隊(duì)列特定鍵內(nèi)容
參數(shù): key:鍵名
返回值:鍵值
*/
void *_Nullable dispatch_get_specific(const void *key);
/*
功能:驗(yàn)證當(dāng)前塊任務(wù)運(yùn)行在指定隊(duì)列上
參數(shù):queue:隊(duì)列
返回值:無(wú)
*/
void dispatch_assert_queue(dispatch_queue_t queue)
DISPATCH_ALIAS_V2(dispatch_assert_queue);
/*
功能:驗(yàn)證當(dāng)前塊任務(wù)運(yùn)行在指定隊(duì)列上,并且該任務(wù)阻塞隊(duì)列中的其它任務(wù)
參數(shù):queue:隊(duì)列
返回值:無(wú)
*/
void dispatch_assert_queue_barrier(dispatch_queue_t queue);
/*
功能:驗(yàn)證當(dāng)前塊任務(wù)沒(méi)有運(yùn)行在指定隊(duì)列上
參數(shù):queue:隊(duì)列
返回值:無(wú)
*/
void dispatch_assert_queue_not(dispatch_queue_t queue)
DISPATCH_ALIAS_V2(dispatch_assert_queue_not);
/******************************************************dispatch—group****************************************************/
/*
功能:創(chuàng)建派遣隊(duì)列組
參數(shù):無(wú)
返回值:隊(duì)列組
*/
dispatch_group_t dispatch_group_create(void);
/*
功能:給指定隊(duì)列添加異步執(zhí)行任務(wù),將隊(duì)列加入組
參數(shù):group:隊(duì)列組 queue:指定隊(duì)列 block/work:任務(wù) context:傳入任務(wù)的參數(shù)
返回值:無(wú)
*/
void dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
void dispatch_group_async_f(dispatch_group_t group,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:等待(阻塞線程)一直到(隊(duì)列組中所有任務(wù)執(zhí)行結(jié)束或者是時(shí)間結(jié)束)
參數(shù):group:隊(duì)列組 timeout:時(shí)間
返回值:0表示成功,非0.錯(cuò)誤
*/
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
/*
功能:隊(duì)列組中所有任務(wù)執(zhí)行結(jié)束之后,執(zhí)行新的block 任務(wù)
參數(shù):group:任務(wù)組 queue:指定隊(duì)列 block/work:新任務(wù) context:傳入任務(wù)的參數(shù)
返回值:任務(wù)組
*/
void dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
void dispatch_group_notify_f(dispatch_group_t group,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/*
功能:管理顯示隊(duì)列組中所有任務(wù)
參數(shù):group:隊(duì)列組
返回值:隊(duì)列組
*/
void dispatch_group_enter(dispatch_group_t group);
/*
功能:管理顯示隊(duì)列組中以執(zhí)行結(jié)束的任務(wù)
參數(shù):group:隊(duì)列組
返回值:隊(duì)列組
*/
void dispatch_group_leave(dispatch_group_t group);
/******************************************************dispatch—semaphore****************************************************/
/*
功能:創(chuàng)建信號(hào)量
參數(shù):value:信號(hào)量資源數(shù)
返回值:信號(hào)量或空(失?。?
*/
dispatch_semaphore_t dispatch_semaphore_create(long value);
/*
功能:等待獲取信號(hào)量,獲取到后開始繼續(xù)執(zhí)行,或是時(shí)間結(jié)束
參數(shù):dsema:信號(hào)量 timeout:限定時(shí)間
返回值:無(wú)
*/
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
/*
功能:執(zhí)行結(jié)束,不需要占用資源,釋放信號(hào)量
參數(shù):dsema:信號(hào)量
返回值:無(wú)
*/
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
/******************************************************dispatch—object****************************************************/
/*
功能:增加隊(duì)列引用計(jì)數(shù)
參數(shù):object:操作隊(duì)列
返回值:無(wú)
*/
void dispatch_retain(dispatch_object_t object);
/*
功能:減少隊(duì)列引用計(jì)數(shù)
參數(shù):object:操作隊(duì)列
返回值:無(wú)
*/
void dispatch_release(dispatch_object_t object);
/*
功能:獲取對(duì)象應(yīng)用程序上下文
參數(shù):object:對(duì)象
返回值:定義內(nèi)容或空
*/
void *_Nullable dispatch_get_context(dispatch_object_t object);
/*
功能:設(shè)置指定對(duì)象的應(yīng)用程序上下文
參數(shù):object:對(duì)象 context:上下文內(nèi)容
返回值:無(wú)
*/
void dispatch_set_context(dispatch_object_t object, void *_Nullable context);
/*
功能:設(shè)置對(duì)象銷毀函數(shù),在該對(duì)象所有引用釋放后,銷毀該對(duì)象
參數(shù):object:對(duì)象 finalizer:銷毀函數(shù)指針
返回值:無(wú)
*/
void dispatch_set_finalizer_f(dispatch_object_t object,
dispatch_function_t _Nullable finalizer);
/*
功能:激活指定非活動(dòng)對(duì)象
參數(shù):object:對(duì)象(一般是線程隊(duì)列)
返回值:無(wú)
*/
void dispatch_activate(dispatch_object_t object);
/*
功能:掛起/阻塞指定對(duì)象(一般是線程隊(duì)列)
參數(shù):object:對(duì)象
返回值:無(wú)
*/
void dispatch_suspend(dispatch_object_t object);
/*
功能:恢復(fù)指定對(duì)象(一般是線程隊(duì)列)
參數(shù):object:對(duì)象
返回值:無(wú)
*/
void dispatch_resume(dispatch_object_t object);
/*
功能:同步等待一個(gè)對(duì)象完成操作,或者是直到超出規(guī)定時(shí)間
參數(shù):object:對(duì)象 timeout:限定時(shí)間
返回值:0成功,非0失敗
*/
long dispatch_wait(void *object, dispatch_time_t timeout);
/*
功能:在指定對(duì)象完成工作后,將一個(gè)通知塊任務(wù)加入指定隊(duì)列
參數(shù):object:對(duì)象 queue:隊(duì)列 notification_block:通知塊
返回值:無(wú)
*/
void dispatch_notify(void *object, dispatch_object_t queue,
dispatch_block_t notification_block);
/*
功能:取消指定對(duì)象
參數(shù):object:對(duì)象
返回值:無(wú)
*/
void dispatch_cancel(void *object);
/*
功能:判斷指定對(duì)象是否被取消
參數(shù):object:對(duì)象
返回值:0表示未取消,其它表示取消
*/
long dispatch_testcancel(void *object);
/*
功能:已編程方式記錄指定對(duì)象的調(diào)試調(diào)度信息
參數(shù):object:對(duì)象
返回值:無(wú)
*/
void dispatch_debug(dispatch_object_t object, const char *message, ...);
void dispatch_debugv(dispatch_object_t object, const char *message, va_list ap);
/******************************************************dispatch—once****************************************************/
/*
功能:只執(zhí)行任務(wù)函數(shù)一次
參數(shù):predicate:dispatch_once_t 對(duì)象 block/function要執(zhí)行的任務(wù)函數(shù) context:傳入的內(nèi)容
返回值:無(wú)
*/
void dispatch_once(dispatch_once_t *predicate,
DISPATCH_NOESCAPE dispatch_block_t block);
void dispatch_once_f(dispatch_once_t *predicate, void *_Nullable context,
dispatch_function_t function);
/******************************************************dispatch—time****************************************************/
/*
功能:創(chuàng)建時(shí)間對(duì)象,在指定時(shí)間的基礎(chǔ)上再添加一段時(shí)間
參數(shù):when:時(shí)間 delta:時(shí)間段(納秒)
返回值:時(shí)間對(duì)象
*/
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
/*
功能:創(chuàng)建時(shí)間對(duì)象,在指定時(shí)間的基礎(chǔ)上再添加一段時(shí)間
參數(shù):when:時(shí)間 delta時(shí)間段(納秒)
返回值:時(shí)間對(duì)象
*/
dispatch_time_t dispatch_walltime(const struct timespec *_Nullable when, int64_t delta);