同步愚墓、異步:
使用dispatch_sync(同步) :dispatch_sync 方法會被加入當(dāng)前隊(duì)列窒舟,而且dispatch_sync 會等待block執(zhí)行完畢才return盈电,block被放到指定的queue上面執(zhí)行沿癞,block里的代碼執(zhí)行完(即代碼執(zhí)行到block結(jié)束的})躁绸,這時候整個dispatch_sync才算執(zhí)行完。說白了就是dispatch_sync正在出隊(duì)列枷莉,但是要等block執(zhí)行完才能完全出隊(duì)列娇昙。
使用dispatch_async(異步):調(diào)用一個block,這個block會被放到指定的queue隊(duì)尾等待執(zhí)行笤妙,至于這個block是并行還是串行只和dispatch_async參數(shù)里面指定的queue是并行還是串行有關(guān)冒掌。但是當(dāng)前隊(duì)列會直接跳過block,也就是不去管block的情況蹲盘,dispatch_async直接執(zhí)行完畢
圖左側(cè)可以看到股毫,卡在了DISPATCH_WAIT_FOR_QUEUE,所以原因就是隊(duì)列阻塞召衔,而不是我們認(rèn)為的線程阻塞皇拣。
dispatch_queue_t queue = dispatch_queue_create("com.yang", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"3");
});
});
});