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 依次輸出、不管你運行多少次都會是這一種結果async

 

可是來看下面的異步呢?函數

//並行隊列、同步
    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 等spa

在iOS中是沒法使用 dispatch_sync(dispatch_get_main_queue() 線程

緣由以下:code

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

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

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

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執行完。

相關文章
相關標籤/搜索