队列分为三种:
- 主队列(Main)由系统创建
dispatch_get_main_queue
- 全局队列 (Global)由系统创建
dispatch_get_global_queue
- 自定义队列,由用户创建
dispatch_queue_create
//获取当前队列
dispatch_queue_t dispatch_get_current_queue(void);
//获取主队列
dispatch_queue_t dispatch_get_main_queue(void)
/*
功能:获取全局并发队列
参数:identifier:队列优先级 typedef long dispatch_queue_priority_t;
flags:保留供将来使用,输入除了0以外的任何值可能返回空值
返回值:全局队列或者空
*/
dispatch_queue_t dispatch_get_global_queue(long identifier, unsigned long flags);
/*
参数类型 dispatch_queue_priority_t
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
*/
dispatch_queue的使用
1.创建dispatch_queue
/*
功能:创建队列
参数:label:队列附带信息,可有可无 attr:队列属性值 target:目标队列,相当于目标队列计数加一
*/
dispatch_queue_t dispatch_queue_create(const char * label,
dispatch_queue_attr_t attr);
dispatch_queue_t dispatch_queue_create_with_target(const char * label,
dispatch_queue_attr_t attr,
dispatch_queue_t target)
/*
队列属性 dispatch_queue_attr_t
DISPATCH_QUEUE_SERIAL NULL //串行队列
DISPATCH_QUEUE_SERIAL_INACTIVE//暂停状态串行队列
DISPATCH_QUEUE_CONCURRENT //并发队列
DISPATCH_QUEUE_CONCURRENT_INACTIVE //暂停状态并发队列
*/
2.添加任务到dispatch_queue
/*
功能:将块函数添加到线程队列中异步执行(异步:执行后不管结果直接返回)
参数:queue:指定的队列 block:任务代码
*/
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
/*
功能:将块函数添加到线程队列中同步执行(异步:执行完成后返回结果)
参数:queue:指定的队列 block: 任务代码
*/
void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
3.添加迭代任务到dispatch_queue
/*
功能:将块函数添加到线程队列中按照迭代次数执行,所有迭代完成后返回结果
参数:iterations:迭代次数 queue:指定的队列 block: 任务代码
*/
void dispatch_apply(size_t iterations,
dispatch_queue_t queue,
void (^block)(size_t));
4.获取dispatch_queue描述信息
/*
功能:获取队列描述信息
参数:label:队列附带信息,可有可无 attr:队列属性值 target:目标队列,相当于目标队列计数加一
返回值:队列附带信息
*/
const char *dispatch_queue_get_label(dispatch_queue_t queue);
5.合并多个dispatch_queue
/*
功能:给指定对象添加到目标队列中
参数:object:目标对象 queue:目标队列
*/
void dispatch_set_target_queue(dispatch_object_t object,
dispatch_queue_t queue);
6.将延时任务添加到dispatch_queue
/*
功能:在指定时间后再目标队列执行block任务
参数:when:时间 queue:目标队列 block:任务代码
*/
void dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
7.将栅栏任务添加到dispatch_queue
/*
功能:给指定队列增加一个阻塞其它异步执行任务的任务
参数:queue:队列 block:任务代码
*/
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
/*
功能:给指定队列增加一个阻塞其它同步执行任务的任务
参数:queue:队列 block:任务代码
*/
void dispatch_barrier_sync(dispatch_queue_t queue,
dispatch_block_t block);
8.给dispatch_queue设置键值对附加参数
/*
功能:当指定队列键值改变时,或者是所有属性值都释放后,调用销毁函数destructor
参数:queue:队列 key:键名 context:新内容 destructor:销毁函数
*/
void dispatch_queue_set_specific(dispatch_queue_t queue,
const void *key,
void * context,
dispatch_function_t destructor);
/*
功能:获取指定队列特定键内容
参数:queue:队列 key:键名
返回值:键值
*/
void * dispatch_queue_get_specific(dispatch_queue_t queue,
const void *key);
/*
功能:获取当前队列特定键内容
参数: key:键名
返回值:键值
*/
void *_Nullable dispatch_get_specific(const void *key);
//-----示例--------
dispatch_queue_t queue_t = dispatch_queue_create("gcd_demo_queue", DISPATCH_QUEUE_CONCURRENT);
static void *vmKey = "vmKey";
dispatch_queue_set_specific(queue_t, vmKey, (__bridge void *)self, NULL);
dispatch_async(queue_t, ^{
QueueVM *value = (__bridge QueueVM *)dispatch_queue_get_specific(queue_t, vmKey);
QueueVM *value1 = (__bridge QueueVM *)dispatch_get_specific(vmKey);
});
9.设置dispatch_queue断言
/*
功能:验证当前块任务运行在指定队列上
参数:queue:队列
*/
void dispatch_assert_queue(dispatch_queue_t queue);
/*
功能:验证当前块任务运行在指定队列上,并且该任务阻塞队列中的其它任务
参数:queue:队列
*/
void dispatch_assert_queue_barrier(dispatch_queue_t queue);
/*
功能:验证当前块任务没有运行在指定队列上
参数:queue:队列
*/
void dispatch_assert_queue_not(dispatch_queue_t queue)
不明白这个函数有什么用
//不明白这个函数有什么用
void dispatch_main(void);