iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死結原因

來源:互聯網
上載者:User

iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死結原因

1:

- (void)viewDidLoad {

//dispatch_sync(dispatch_get_main_queue(), ^{
//NSLog(@3);
//死結原因
//1:dispatch_sync在等待block語句執行完成,而block語句需要在主線程裡執行,所以dispatch_sync如果在主線程調用就會造成死結
//2:dispatch_sync是同步的,本身就會阻塞當前線程,也即主線程。而又往主線程裡塞進去一個block,所以就會發生死結。
//});
//dispatch_async(dispatch_get_global_queue(), ^{
//async 在主線程中 建立了一個非同步線程 加入 全域並發隊列,async 不會等待block 執行完成,立即返回

NSLog(@2);//不會造成死結;

});

}

分析這段代碼:view DidLoad 在主線程中,也即dispatch_get_main_queue()中,執行到sync時向dispatch_get_main_queue()插入同步thread,sync會等到後面的block執行完成才返回。sync又在主隊列裡面,是個串列隊列,sync是後面才加入的,前面一個是主線程,所以sync想執行block必須等待前一個主線程執行完成,而主線程卻

在等待sync返回,去執行後續工作,從而造成死結。

2:

dispatch_sync 和 dispatch_async 區別:

dispatch_async(queue,block) async 非同步隊列,dispatch_async 函數會立即返回, block會在後台非同步執行。
dispatch_sync(queue,block) sync 同步隊列,dispatch_sync 函數不會立即返回,即阻塞當前線程,等待 block同步執行完成。

3:

 

GCD Queue 分為三種:

1,The main queue :主隊列,主線程就是在個隊列中。

2,Global queues : 全域並發隊列。

3,使用者隊列:是用函數 dispatch_queue_create 建立的自訂隊列


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.