dispatch_sync和dispatch_async的區別


dispatch_sync 線程同步、dispatch_async線程異步

比如

   //同步
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 1");
    });
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 2");
    });
    
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 3");
    });
    
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 4");
    });

這些代碼輸出的結果是 1 2 3 4 依次輸出、無論你運行多少次都會是這一種結果

 

但是來看下面的異步呢?

//並行隊列、同步
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"1");
    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"2");
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"3");
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"4");
    });
    

輸出的結果是 1 2 3 4 隨機輸出、有時 2 1 3 4  有時  1 3 2 4 等

 

 

在iOS中是無法使用 dispatch_sync(dispatch_get_main_queue() 

 

原因如下:

在iOS使用 dispatch_sync(dispatch_get_main_queue()^(){block體});

dispath向主隊列加一個同步的block;

此時主隊列在等待    dispatch_sync(dispatch_get_main_queue(),^(){block體});執行

dispatch_sync在等待主隊列執行完畢。

所以在此過程中,我們最初調用的dispatch_sync函數一直得不到返回,main queue被阻塞,而我們的block又需要等待main queue來執行它。造成死鎖。

 

在iOS 使用主隊列 dispatch_get_main_queue() 時 應該使用異步執行

dispatch_async(dispatch_get_main_queue(), ^(){

        NSLog(@"222");

   });

 

 

dispatch_sync  :調用用    dispatch_sync的線程會等dispatch_sync的對內容執行完再繼續執行。

dispatch_async :調用dispatch_async的線程不會的等dispatch_async的內容,自己繼續執行。

sync/async的區別在於 調用diapatch的線程是否等待dispatch執行完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM