dispatch_sync 線程同步、dispatch_async線程非同步 比如 這些代碼輸出的結果是 1 2 3 4 依次輸出、無論你運行多少次都會是這一種結果 但是來看下麵的非同步呢? 輸出的結果是 1 2 3 4 隨機輸出、有時 2 1 3 4 有時 1 3 2 4 等 在iOS中是無法使用 d ...
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執行完。