美文网首页
GCDAPI常用整理(一)

GCDAPI常用整理(一)

作者: Qing学 | 来源:发表于2018-01-09 00:13 被阅读0次

GCD是异步任务的技术之一,开发者只要将想要执行的任务添加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的。
1.创建DispatchQueue
创建单线程的queue:单线程的队列一次只能执行一个任务

dispatch_queue_t queueBase = dispatch_queue_create("com.cn.qxhomePage", DISPATCH_QUEUE_SERIAL);

创建多线程的queue:多线程队列中可以同时执行多个任务

    dispatch_queue_t queueGlobal = dispatch_queue_create("com.cn.qxCurrentQueue", DISPATCH_QUEUE_CONCURRENT);

2.GCD的内存管理
自动SDK6.0以后GCD已经支持ARC管理。所以不需要对queue进行手动内存管理。如果是非ARC那么就可以使用以下方法来对Queue进行管理
对queue对象引用计数起+1
dispatch_retain(queueBase);
对queue对象引用计数-1
dispatch_release(queueBase);
如果是ARC切SDK6.0以后就不要进行手动内存管理
3.系统标准提供的Dispatch Queue
Main Dispatch Queue/Global Dispatch Queue
获取主线程的方法

dispatch_queue_t serialQueue = dispatch_get_main_queue();

因为主线程只有一个。所以必然是串行队列。所有需要进行UI更新的操作都需要放到主线程中处理

dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

第一个参数是一个枚举。代表这个线程处理的优先级。第二个参数默认为0
串行队列和并行队列的任务执行结果如下

dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_queue_t serialQueue = dispatch_get_main_queue();
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列1");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列2");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列3");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列4");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列5");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列6");
    });
    dispatch_async(currentQueue, ^{
        NSLog(@"并行队列7");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"串行队列1");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"串行队列2");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"串行队列3");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"串行队列4");
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"串行队列5");
    });

运行结果为

2018-01-09 00:05:48.353162+0800 Dispatch_queue[8431:310554] 并行队列1
2018-01-09 00:05:48.353257+0800 Dispatch_queue[8431:310556] 并行队列2
2018-01-09 00:05:48.354489+0800 Dispatch_queue[8431:310557] 并行队列5
2018-01-09 00:05:48.353961+0800 Dispatch_queue[8431:310554] 并行队列3
2018-01-09 00:05:48.354033+0800 Dispatch_queue[8431:310556] 并行队列4
2018-01-09 00:05:48.355329+0800 Dispatch_queue[8431:310562] 并行队列7
2018-01-09 00:05:48.354526+0800 Dispatch_queue[8431:310555] 并行队列6
2018-01-09 00:05:48.361822+0800 Dispatch_queue[8431:310451] 串行队列1
2018-01-09 00:05:48.362185+0800 Dispatch_queue[8431:310451] 串行队列2
2018-01-09 00:05:48.364785+0800 Dispatch_queue[8431:310451] 串行队列3
2018-01-09 00:05:48.365115+0800 Dispatch_queue[8431:310451] 串行队列4
2018-01-09 00:05:48.365582+0800 Dispatch_queue[8431:310451] 串行队列5

结果分析为:串行队列任务都是按照顺序执行的。每次都只能执行一个任务。
并行队列因为可以同时执行多个任务。所以执行任务顺序不一定。有可能先被加入队列的任务执行的晚于后加入队列的任务。
4.dispatch_set_target_queue
使用示例如下:

dispatch_queue_t currentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_queue_t queueT = dispatch_queue_create("baseQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(queueT, currentQueue);

使用分析、使用set_target_queue方法可以将第一个参数的的任务执行优先级设置为第二个参数的优先级。相示例这样就将queueT的执行优先级设置为了DISPATCH_QUEUE_PRIORITY_HIGH。如果多个串行队列都调用set_target_queue方法设置一个串行队列A为执行队列。那么本来相互并行执行的串行队列,在队列A上执行任务的这些任务只能同时执行一个处理。可以用在某些情况下的数据写入的互斥等。

相关文章

  • GCDAPI常用整理(一)

    GCD是异步任务的技术之一,开发者只要将想要执行的任务添加到Dispatch Queue中,GCD就能生成必要的线...

  • 常用GCDAPI整理(二)

    先列一下本篇文章所整理的提纲1.GCD的延迟运行2.使用Dispatch_group进行线程同步处理3.使用dis...

  • 常用整理

    1,99美元账号申请http://www.jianshu.com/p/9b994a019ee6 2,证书相关htt...

  • nginx 2

    1 nginx 常用模块整理 nginx 常用模块整理1 http核心模块 ngx_http_core_modu...

  • PHP常用函数整理(一)

    数学函数 abs(): 求绝对值 ceil():进一法取整 floor():舍去法取整 fmod():浮点数取余<...

  • CALayer常用属性整理(一)

    写在前面 本文是作者阅读《iOS Core Animation: Advanced Techniques》后对其内...

  • Android Studio (Windows)快捷键

    1, 最常用快捷键 2, 整理2 3, 整理3

  • 常用sql整理

    1、if test 函数 2、COALESCE 函数 表示如果查询结果为空,用其他数值代替 3、round 函数参...

  • 整理常用CSS

    字体属性:(font) CSS文字属性: CSS边框空白 CSS符号属性: CSS背景样式: 指定背景位置 CSS...

  • 常用函数整理

网友评论

      本文标题:GCDAPI常用整理(一)

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