1.首先看一下官方文檔的解釋,這個block的隊列是同步執行的,不像異步,這個方法直到block執行完畢纔會返回異步
2.主線程一旦開啓,就要先把本身的代碼執行完成以後,纔去執行加入到主隊列中的任務async
void dispatch_sync( dispatch_queue_t queue, dispatch_block_t block);
this
queue |
The queue on which to submit the block. This parameter cannot be |
block |
The block to be invoked on the target dispatch queue. This parameter cannot be |
Submits a block to a dispatch queue for synchronous execution. Unlike dispatch_async
, this function does not return until the block has finished. Calling this function and targeting the current queue results in deadlock.code
a) dispatch_sync這個方法要等到block的執行完以後,才返回orm
b) 主線程一旦開啓,就要先把本身的代碼執行完成以後,纔去執行加入到主隊列中的任務隊列
c) 這樣主線程想要執行block,先要下去執行下面的代碼,可是由於dispatch_sync這個方法,,若是返回不了,主線程就沒法向下再次執行,因此形成了死鎖,因此把主線程卡到這裏了,形成了死鎖ci
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); // 任務1 此時只會執行到任務一結束,就不會再繼續執行了 dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2--%@",[NSThread currentThread]); // 任務2 }); NSLog(@"3"); // 任務3 }
NSLog(@"1"); // 任務1 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"2"); // 任務2 }); NSLog(@"3"); // 任務3 此時都會打印出來