隊列queue.h方法總覽
queue.h
異步(async)同步(sync)相關(guān)方法:
一、dispatch_async和dispatch_sync方法需要傳二個參數(shù),第一個參數(shù)是queue(隊列),第二個參數(shù)是block(任務(wù))卵佛;dispatch_async是異步繼續(xù)執(zhí)行,不會阻塞當前調(diào)用的GCD線程,而dispatch_sync同步調(diào)用該GCD線程财岔,會阻塞當前調(diào)用的GCD線程,直到block調(diào)用完結(jié)束河爹。
二匠璧、方法名帶后準_f的和不帶后綴的運行意義完全一樣,不同之處在于傳入的參數(shù)不同咸这。
三夷恍、方法名帶_barrier和不帶_barrier的區(qū)別體現(xiàn)在并發(fā)隊列,讓一些任務(wù)等待_barrier任務(wù)先執(zhí)行或者后執(zhí)行媳维。
/**
異步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param block 任務(wù)
*/
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
/**
異步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param context 傳遞給work的任意類型(void *)參數(shù)
@param work 執(zhí)行的C語言函數(shù)名(函數(shù)指針)
*/
void
dispatch_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
同步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param block 任務(wù)
*/
void
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
/**
同步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param context 傳遞給work的任意類型(void *)參數(shù)
@param work 執(zhí)行的C語言函數(shù)名(函數(shù)指針)
*/
void
dispatch_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
異步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param block 任務(wù)
*/
void
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
/**
異步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param context 傳遞給work的任意類型(void *)參數(shù)
@param work 執(zhí)行的C語言函數(shù)名(函數(shù)指針)
*/
void
dispatch_barrier_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
同步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param block 任務(wù)
*/
void
dispatch_barrier_sync(dispatch_queue_t queue,
DISPATCH_NOESCAPE dispatch_block_t block);
/**
同步執(zhí)行
@param queue 提交到的隊列(隊列的類型決定了是串行還是并行執(zhí)行隊列中的任務(wù))
@param context 傳遞給work的任意類型(void *)參數(shù)
@param work 執(zhí)行的C語言函數(shù)名(函數(shù)指針)
*/
void
dispatch_barrier_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
舉例說明:
一酿雪、帶后綴_f與不帶后綴區(qū)別
int context = 10;
dispatch_async_f(dispatch_get_global_queue(0, 0), &context, logCount);
//C函數(shù)
void logCount(void* context) {
int *c = context;
NSLog(@"內(nèi)存地址 === %p 值 === %d", &c,*c);
}
二、帶_barrier和不帶_barrier的區(qū)別
dispatch_queue_t queue = dispatch_queue_create("com.Maker", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^(){
NSLog(@"任務(wù)_1");
});
dispatch_async(queue, ^(){
NSLog(@"任務(wù)_2");
});
dispatch_async(queue, ^(){
NSLog(@"任務(wù)_barrier");
});
dispatch_async(queue, ^(){
NSLog(@"任務(wù)_3");
});
dispatch_async(queue, ^(){
NSLog(@"任務(wù)_4");
});
/*
在并行隊列中侨艾,dispatch_barrier_async 作用是會等待前面兩個任務(wù)并行執(zhí)行完成执虹,
這里是并行輸出 任務(wù)_1 / 任務(wù)_2 或者 任務(wù)_2 / 任務(wù)_1
然后執(zhí)行
dispatch_barrier_async中的操作,等_barrier任務(wù)執(zhí)行完成后唠梨,即輸出 任務(wù)_barrier
最后并行隊列恢復(fù)原有執(zhí)行狀態(tài)袋励,繼續(xù)并行執(zhí)行,
這里是并行輸出 任務(wù)_3 / 任務(wù)_4 或者 任務(wù)_4 / 任務(wù)_3
在串行隊列中当叭,還是串行執(zhí)行茬故。
*/
注意:帶有后綴_f(比如dispatch_sync_f
,dispatch_async_f
)就是提交給隊列一個C語言函數(shù)蚁鳖。