队列queue.h方法总览


异步(async)同步(sync)相关方法:
一、dispatch_async和dispatch_sync方法需要传二个参数,第一个参数是queue(队列),第二个参数是block(任务);dispatch_async是异步继续执行,不会阻塞当前调用的GCD线程,而dispatch_sync同步调用该GCD线程,会阻塞当前调用的GCD线程,直到block调用完结束。
二、方法名带后准_f的和不带后缀的运行意义完全一样,不同之处在于传入的参数不同。
三、方法名带_barrier和不带_barrier的区别体现在并发队列,让一些任务等待_barrier任务先执行或者后执行。
/**
异步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param block 任务
*/
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
/**
异步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param context 传递给work的任意类型(void *)参数
@param work 执行的C语言函数名(函数指针)
*/
void
dispatch_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
同步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param block 任务
*/
void
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
/**
同步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param context 传递给work的任意类型(void *)参数
@param work 执行的C语言函数名(函数指针)
*/
void
dispatch_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
异步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param block 任务
*/
void
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
/**
异步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param context 传递给work的任意类型(void *)参数
@param work 执行的C语言函数名(函数指针)
*/
void
dispatch_barrier_async_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
/**
同步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param block 任务
*/
void
dispatch_barrier_sync(dispatch_queue_t queue,
DISPATCH_NOESCAPE dispatch_block_t block);
/**
同步执行
@param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
@param context 传递给work的任意类型(void *)参数
@param work 执行的C语言函数名(函数指针)
*/
void
dispatch_barrier_sync_f(dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
举例说明:
一、带后缀_f与不带后缀区别
int context = 10;
dispatch_async_f(dispatch_get_global_queue(0, 0), &context, logCount);
//C函数
void logCount(void* context) {
int *c = context;
NSLog(@"内存地址 === %p 值 === %d", &c,*c);
}
二、带_barrier和不带_barrier的区别
dispatch_queue_t queue = dispatch_queue_create("com.Maker", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^(){
NSLog(@"任务_1");
});
dispatch_async(queue, ^(){
NSLog(@"任务_2");
});
dispatch_async(queue, ^(){
NSLog(@"任务_barrier");
});
dispatch_async(queue, ^(){
NSLog(@"任务_3");
});
dispatch_async(queue, ^(){
NSLog(@"任务_4");
});
/*
在并行队列中,dispatch_barrier_async 作用是会等待前面两个任务并行执行完成,
这里是并行输出 任务_1 / 任务_2 或者 任务_2 / 任务_1
然后执行
dispatch_barrier_async中的操作,等_barrier任务执行完成后,即输出 任务_barrier
最后并行队列恢复原有执行状态,继续并行执行,
这里是并行输出 任务_3 / 任务_4 或者 任务_4 / 任务_3
在串行队列中,还是串行执行。
*/
注意:带有后缀_f(比如dispatch_sync_f
,dispatch_async_f
)就是提交给队列一个C语言函数。
网友评论