同步(dispatch_sync):
dispatch_sync(fcQueue, ^{
NSLog(@"1"); // 任務 1
});
NSLog(@"2"); // 任務 2
dispatch_sync(fcQueue, ^{
NSLog(@"3"); // 任務 3
});
NSLog(@"4"); // 任務 4
輸出:“1234”
。
異步(dispatch_async):
dispatch_async(serialQueue, ^{
NSLog(@"1"); //任務 1
});
NSLog(@"2");
dispatch_async(serialQueue, ^{
NSLog(@"3"); //任務 3
});
NSLog(@"4");
上面代碼執行結果可能為 “1234”、“1243”、“2134”、“2143”、“2413”
中的一種,2 始終在 4 前面,1 始終在 3 前面,2 始終在 3 前面。
死鎖
NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2"); // 任務2
});
NSLog(@"3"); // 任務3
輸出: 1
。
MainQueue.png
如圖所示,代碼中dispatch_sync(dispatch_get_main_queue(), ^{ });
會獲取主線程(當前線程)阻塞之,執行完任務1就不會繼續走任務2,它會把任務2放到任務3后面,等到任務2執行完才會打通阻塞的地方繼續執行,可是任務2不可能執行完,因為主線程已經堵住了~
Go on
NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"2"); // 任務2
});
NSLog(@"3"); // 任務3
輸出: 1 2 3
。
同步線程2
Go on
dispatch_queue_t queue = dispatch_queue_create("com.fcDemo.serialQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"1"); // 任務1
dispatch_async(queue, ^{
NSLog(@"2"); // 任務2
dispatch_sync(queue, ^{
NSLog(@"3"); // 任務3
});
NSLog(@"4"); // 任務4
});
NSLog(@"5"); // 任務5
輸出:1 5 2
或 1 2 5
。
Go on
NSLog(@"1"); // 任務1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"2"); // 任務2
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"3"); // 任務3
});
NSLog(@"4"); // 任務4
});
NSLog(@"5"); // 任務5
輸出: 12534
或15234
。
Go on
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2"); // 任務2
});
NSLog(@"3"); // 任務3
});
NSLog(@"4"); // 任務4
while (1) {
}
NSLog(@"5"); // 任務5
輸出:14
或41
。
-“大圣,此去欲何?”
-“踏南天,碎凌霄。”
-“如若一去不回...”
-“便一去不回。”
有此等的英勇壯志奈何一個GCD乎?