首先看下面一段代碼
dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{//taskA
//do something
dispatch_sync(queue, ^{//taskB
//啥也干不了
});
});
dispatch_sync函數(shù)用于將一個block(任務)提交到隊列中同步執(zhí)行,直到block執(zhí)行完后今布,這個函數(shù)才會返回褒链。queue是一個串行隊列捻爷,如果先后加入兩個任務,taskA和taskB, 那么只有taskA執(zhí)行完之后taskB才能執(zhí)行规丽。如果taskB是在taskA中加進隊列的蒲牧,那么它們依然遵守先進先出原則,即taskA執(zhí)行完之后taskB才執(zhí)行赌莺,也就是taskB在等待taskA完成冰抢。但是因為dispatch_sync的同步特性,taskB執(zhí)行不完taskA就不算完成,即taskA在等待taskB的完成艘狭,這樣就發(fā)生了死鎖挎扰。
根據(jù)上面那份代碼,我們就可以理解下面的代碼為什么會阻塞主線程了巢音。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
NSLog(@"hello");
});
mainQueue是系統(tǒng)創(chuàng)建的遵倦,在執(zhí)行上面的代碼之前就已經(jīng)加進去了很多任務
dispatch_queue_t queue = dispatch_queue_create("Main", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
//Task A
});
...
dispatch_sync(queue, ^{
//Task N
});
在這N個任務里有一個任務是這樣的:
dispatch_sync(queue, ^{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
NSLog(@"hello");
});
});
所以,發(fā)生死鎖就是必然的了官撼。