### 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í)行完畢!");
});
}