GCD幾種組合的使用

### GCD常用隊(duì)列

主線程:UI操作在這條線程上而已,這是主線程和其它線程的區(qū)別.主線程

掛掉不會(huì)影響其它線程.只要是刷新UI,就在主線程.

A.異步函數(shù)+并行隊(duì)列

會(huì)創(chuàng)建新線程,各線程也是并發(fā)執(zhí)行的.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_async(queue,^{ func1(); });

dispatch_async(queue,^{ func2(); });

B.異步函數(shù)+串行隊(duì)列

只開啟一個(gè)新線程,做完其中一個(gè)任務(wù),再做另一個(gè)任務(wù)

dispatch_queue_t queue = dispatch_queue_create("compress_queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(queue,^{ func1(); });

dispatch_async(queue,^{ func2(); });

C.同步函數(shù)+串行隊(duì)列

不會(huì)開啟新線程.任務(wù)串行執(zhí)行 (用于主隊(duì)列將會(huì)死鎖)

dispatch_queue_t queue = dispatch_queue_create("compress_queue", DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue,^{ func1(); });

dispatch_sync(queue,^{ func2(); });

D.同步函數(shù)+并行隊(duì)列

在當(dāng)前線程執(zhí)行任務(wù)

dispatch_sync(queue,^{});


### 面試題:異步多請(qǐng)求

當(dāng)a,b,c,d四個(gè)線程,a,b,c執(zhí)行完的結(jié)果,將作為d的一個(gè)參數(shù)傳入,怎么實(shí)現(xiàn)? (個(gè)人覺(jué)得這個(gè)問(wèn)題這是一個(gè)道非常好的面試題,但是小編沒(méi)有答上來(lái),很是尷尬)

如果你說(shuō)出了dispatch_group,或者隊(duì)列組這個(gè)兩個(gè)關(guān)鍵詞,那恭喜你答對(duì)了,下面是示例代碼。

/**

*? 使用dispatch_group,異步多請(qǐng)求

*/

- (void)asyncBaseData

{

// 全局并行隊(duì)列

dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

// 創(chuàng)建一個(gè)group

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, globalQueue, ^{

// 執(zhí)行請(qǐng)求1... (這里的代碼需要時(shí)同步執(zhí)行才能達(dá)到效果)

});

dispatch_group_async(group, globalQueue, ^{

// 執(zhí)行請(qǐng)求2...

});

dispatch_group_async(group, globalQueue, ^{

// 執(zhí)行請(qǐng)求N...

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"全部請(qǐng)求執(zhí)行完畢!");

});

}

最后編輯于
?著作權(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)容

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