GCD - dispatch_queue 的理解及使用

队列分为三种:

  • 主队列(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);

你可能感兴趣的:(GCD - dispatch_queue 的理解及使用)