iOS多線程之GCD

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);  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 多線程 在iOS開發(fā)中為提高程序的運(yùn)行效率會(huì)將比較耗時(shí)的操作放在子線程中執(zhí)行,iOS系統(tǒng)進(jìn)程默認(rèn)啟動(dòng)一個(gè)主線程,用...
    郭豪豪閱讀 2,719評(píng)論 0 4
  • 一、多線程簡(jiǎn)介: 所謂多線程是指一個(gè) 進(jìn)程 -- process(可以理解為系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序)中可以開...
    尋形覓影閱讀 1,181評(píng)論 0 6
  • 1. GCD簡(jiǎn)介 什么是GCD呢?我們先來(lái)看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 495評(píng)論 0 0
  • iOS多線程之GCD 什么是GCD GCD(grand central dispatch) 是 libdispat...
    comst閱讀 1,327評(píng)論 0 0
  • 有人說(shuō):人的一生是由出生決定的。這無(wú)疑是一句極其惡毒的話,但很多事實(shí)證明,出身才是影響人一生的重要因素。納蘭容...
    豬八戒的小老婆閱讀 741評(píng)論 0 0

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