美文网首页
GCD - dispatch_queue 的理解及使用

GCD - dispatch_queue 的理解及使用

作者: Onego | 来源:发表于2018-01-05 16:59 被阅读30次

队列分为三种:

  • 主队列(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 的理解及使用

    队列分为三种: 主队列(Main)由系统创建 dispatch_get_main_queue 全局队列 (Glob...

  • 深入理解GCD之dispatch_semaphore

    原文链接深入理解GCD之dispatch_semaphore 再研究完dispatch_queue之后,本来是打算...

  • 多线程系列文章

    GCD基础篇 - 同步、异步,并发、并行的理解 GCD中级篇 - dispatch_group的理解及使用 dis...

  • GCD之dispatch_queue

    概述 dispatch_queue可以说是GCD编程中使用频率最高的API,本篇文章主要讲一下queue的相关用法...

  • iOSgcd队列

    ios的gcd dispatch_queue可以理解为是一种线程池化技术的实现。 1,全局一共几个池?除了主线程所...

  • 多线程编程之GCD(二)

    承接上一篇:多线程编程之GCD(一) 三、系统Dispatch_Queue GCD提供了两个系统的Queue:1、...

  • iOS GCD中级篇 - dispatch_semaphore(

    转载自:iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用理解这个概念之前,先抛...

  • 深入理解GCD之dispatch_queue

    1.前言 上一篇我们介绍了GCD的结构体,这一篇我们着重看一下GCD中队列的构成。队列是我们在使用GCD中经常接触...

  • GCD学习

    GCD 学习(-) dispatch_group 如果想在dispatch_queue中所有的任务执行完成后在做某...

  • GCD 学习(四) dispatch_group

    GCD 学习(四) dispatch_group 如果想在dispatch_queue中所有的任务执行完成后在做某...

网友评论

      本文标题:GCD - dispatch_queue 的理解及使用

      本文链接:https://www.haomeiwen.com/subject/zeolnxtx.html