iOS多線程-GCD之同步和異步

上一篇 iOS多線程-GCD之串行隊(duì)列和并行隊(duì)列

在GCD中,同步和異步是由這兩個(gè)函數(shù)來(lái)完成的:dispatch_syncdispatch_async

一、釋義

void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

這兩個(gè)函數(shù)的參數(shù)是一致的

第一個(gè)參數(shù) queue 是即將要追加操作的隊(duì)列
第二個(gè)參數(shù) block 是要執(zhí)行的操作(即代碼塊)

它們都會(huì)將要執(zhí)行的操作立刻追加到隊(duì)列中,區(qū)別在于,dispatch_sync會(huì)等待操作執(zhí)行完畢,再執(zhí)行函數(shù)外的操作;dispatch_async不會(huì)等待操作執(zhí)行完畢,而是直接繼續(xù)執(zhí)行函數(shù)外的操作。

二、dispatch_sync

//獲取一個(gè)全局隊(duì)列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//要執(zhí)行的block
void (^blk)() = ^{
    NSLog(@"Execute block");
};

//同步執(zhí)行操作
dispatch_sync(globalQueue, blk);
NSLog(@"Done!");

運(yùn)行結(jié)果:

2017-02-27 22:36:32.362 GCDLearn[1196:88920] Execute block
2017-02-27 22:36:32.363 GCDLearn[1196:88920] Done!

三、dispatch_async

//異步執(zhí)行操作, globalQueue、blk同上
dispatch_async(globalQueue, blk);
NSLog(@"Done!");

運(yùn)行結(jié)果:

2017-02-27 22:38:09.014 GCDLearn[1219:90936] Done!
2017-02-27 22:38:09.014 GCDLearn[1219:91096] Execute block

四、理解

試著理解下面這部分代碼

dispatch_queue_t serialQueue = dispatch_queue_create("com.gcd.syncAndAsyncMix.serialQueue", NULL);
dispatch_async(serialQueue, ^{
    NSLog(@"1");
});
dispatch_async(serialQueue, ^{
    NSLog(@"11");
});
dispatch_async(serialQueue, ^{
    NSLog(@"111");
});
dispatch_async(serialQueue, ^{
    NSLog(@"1111");
});
NSLog(@"2");
dispatch_sync(serialQueue, ^{
    NSLog(@"3");
});
NSLog(@"4");

運(yùn)行結(jié)果:

2017-02-27 22:53:54.204 GCDLearn[1402:101052] 2
2017-02-27 22:53:54.204 GCDLearn[1402:101213] 1
2017-02-27 22:53:54.205 GCDLearn[1402:101213] 11
2017-02-27 22:53:54.206 GCDLearn[1402:101213] 111
2017-02-27 22:53:54.206 GCDLearn[1402:101213] 1111
2017-02-27 22:53:54.206 GCDLearn[1402:101052] 3
2017-02-27 22:53:54.207 GCDLearn[1402:101052] 4

對(duì)于串行隊(duì)列來(lái)說(shuō),無(wú)論是sync還是async,操作執(zhí)行的順序與追加的順序一致。

GCD學(xué)習(xí)代碼 如果覺(jué)得有用,順便給顆星哦??
下一篇:iOS多線程-GCD之dispatch_set_target_queue

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. GCD簡(jiǎn)介 什么是GCD呢?我們先來(lái)看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 499評(píng)論 0 0
  • 1. GCD簡(jiǎn)介 iOS開(kāi)發(fā)中多線程的API主要有pthread,NSThread,NSOperation和GCD...
    安東_Ace閱讀 1,394評(píng)論 0 6
  • 簡(jiǎn)介 GCD(Grand Central Dispatch)是在macOS10.6提出來(lái)的,后來(lái)在iOS4.0被引...
    sunmumu1222閱讀 955評(píng)論 0 2
  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時(shí)候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,393評(píng)論 21 42
  • 目錄 一、基本概念1.多線程2.串行和并行, 并發(fā)3.隊(duì)列與任務(wù)4.同步與異步5.線程狀態(tài)6.多線程方案 二、GC...
    BohrIsLay閱讀 1,693評(píng)論 5 12

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