好久沒有來部落發(fā)表文章了,今天自己回顧一下GCD吧,這在以后的開發(fā)中最常用的。說到GCD,必須強(qiáng)調(diào)隊(duì)列和任務(wù)兩個(gè)詞,很多人容易搞混(當(dāng)然,本人一開始接觸ios也是一樣懵逼),隊(duì)列其實(shí)就跟物理課上的串聯(lián),并聯(lián)電路差不多吧,任務(wù)就是同異步之分,同步不開啟線程,異步開啟新線程。這里就簡單明了的說下吧:
點(diǎn)擊鏈接加入群【ios開發(fā)學(xué)習(xí)】:https://jq.qq.com/
隊(duì)列:
串行隊(duì)列:在隊(duì)列中多個(gè)線程中有序進(jìn)行;
并行隊(duì)列:在隊(duì)列中多個(gè)線程同時(shí)進(jìn)行,沒有順序;
任務(wù):
同步:?sync ,它會阻塞當(dāng)前線程,等待隊(duì)列中的任務(wù)執(zhí)行完畢,然后當(dāng)前線程才會繼續(xù);
異步:async,不會阻塞線程,會直接往下執(zhí)行;
代碼:
1.主線程隊(duì)列:
主線程異步隊(duì)列中,也是順序執(zhí)行的,主線程中有任務(wù),必須等主線程中的任務(wù)執(zhí)行完畢才執(zhí)行主隊(duì)列,如果主線程中使用同步隊(duì)列將會導(dǎo)致線程鎖死,這點(diǎn)要注意,鎖死的原因是循環(huán)等待,主隊(duì)列的東西要等主線程執(zhí)行完,而因?yàn)橥綀?zhí)行不能開線程,所以下面的任務(wù)要等上面的任務(wù)執(zhí)行完,所以鎖死。
//主異步:在主線程中順序執(zhí)行
dispatch_queue_tmain =dispatch_get_main_queue();
for(inti =0; i <10; i++) {
dispatch_async(main, ^{
NSLog(@"主隊(duì)列,異步%@",[NSThreadcurrentThread]);
});
}
}
//主同步:會造成線程鎖死
dispatch_queue_tmain =dispatch_get_main_queue();
for(inti =0; i <0; i++) {
dispatch_sync(main, ^{
NSLog(@"你這是要鎖死我%@",[NSThreadcurrentThread]);
});
}
2.串行隊(duì)列:
//串行同步:不開線程,在當(dāng)前線程中有序的進(jìn)行
dispatch_queue_tqueue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
for(inti =0; i <10; i++) {
dispatch_sync(cxTongB, ^{
NSLog(@"串行隊(duì)列,同步%@",[NSThreadcurrentThread]);
});
}
//串行異步:開啟一條線程,然后有序的執(zhí)行
dispatch_queue_tqueue =dispatch_queue_create("YIBU",DISPATCH_QUEUE_SERIAL);
for(inti =0; i <10; i++) {
dispatch_async(queue, ^{
NSLog(@"串行隊(duì)列,異步%@",[NSThreadcurrentThread]);
});
}
3.并行隊(duì)列
//并行同步:不開啟線程,在當(dāng)前線程有序進(jìn)行
dispatch_queue_tbxtongbu =dispatch_queue_create("bxtongbu",DISPATCH_QUEUE_CONCURRENT);
for(inti =0; i <10; i++) {
//同步執(zhí)行
dispatch_sync(bxtongbu, ^{
NSLog(@"并行隊(duì)列,同步%@",[NSThreadcurrentThread]);
});
}
//并行異步:開啟多條線程,并發(fā)執(zhí)行
dispatch_queue_tqueue =dispatch_queue_create("bxYibu",DISPATCH_QUEUE_CONCURRENT);
for(inti =0; i <10; i++) {
dispatch_sync(queue, ^{
NSLog(@"并行隊(duì)列,異步%@",[NSThreadcurrentThread]);
});
}
總結(jié):
1. 開不開線程,取決于執(zhí)行任務(wù)的函數(shù),同步不開,異步開。
2. 開幾條線程,取決于隊(duì)列,串行開一條,并發(fā)開多條(異步)
3. 主隊(duì)列:專門用來在主線程上調(diào)度任務(wù)的"隊(duì)列",主隊(duì)列不能在其他線程中調(diào)度任務(wù)
4. 如果主線程上當(dāng)前正在有執(zhí)行的任務(wù),主隊(duì)列暫時(shí)不會調(diào)度任務(wù)的執(zhí)行!主隊(duì)列同步任務(wù),會造成死鎖。原因是循環(huán)等待
5. 同步任務(wù)可以隊(duì)列調(diào)度多個(gè)異步任務(wù)前,指定一個(gè)同步任務(wù),讓所有的異步任務(wù),等待同步任務(wù)執(zhí)行完成,這是依賴關(guān)系。
6.?全局隊(duì)列:并發(fā),能夠調(diào)度多個(gè)線程,執(zhí)行效率高,但是相對費(fèi)電。 串行隊(duì)列效率較低,省電省流量,或者是任務(wù)之間需要依賴也可以使用串行隊(duì)列。
7. 也可以通過判斷當(dāng)前用戶的網(wǎng)絡(luò)環(huán)境來決定開的線程數(shù)。
想學(xué)習(xí)iOS的小伙伴們可以加裙一起交流哦!626433463