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