GCD

作者: 阿什不可思 | 来源:发表于2017-04-21 10:37 被阅读0次
  1. dispatch_queue_create
    串行队列:先后顺序,依赖关系
  • dispatch_get_global_queue
    并行队列:不存在任何依赖关系,提高执行速度
  • dispatch_group_create
    分组任务:几个任务之间存在关系,最后一个任务依赖于前几个
  • dispatch_once_t
    一次:只执行一次
  • dispatch_barrier_async
    障碍:后几个需要前几个执行完,自己创建的队列,才能添加障碍,
  • dispatch_after
    延迟: 需要延迟几秒
  • dispatch_apply
    反复执行:并发执行的特例版, 10任务的内容都是一样的

<pre><code>

  1. //串行队列, 线程同步,
    //1.获取串行队列
    //(1)获取系统创建好的串行队列,主队列,在主线程中执行
    // dispatch_queue_t queue = dispatch_get_main_queue();
    //(2)自己创建串行队列, 在子线程中执行
    dispatch_queue_t queue = dispatch_queue_create("frank", DISPATCH_QUEUE_SERIAL);
    //SERIAL串行
    //2.往队列中添加任务
    dispatch_async(queue, ^{
    NSLog(@"任务1,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务2,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务3,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务4,当前线程%@", [NSThread currentThread]);
    });
  2. //并行队列, 线程并发
  • (IBAction)handleConcurrentQueue:(UIButton *)sender {
    //1.获取并行队列
    //(1)获取系统创建的并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //(2)自己创建并行队列
    // dispatch_queue_t queue = dispatch_queue_create("dd", DISPATCH_QUEUE_CONCURRENT);
    //2.往队列中添加任务
    dispatch_async(queue, ^{
    NSLog(@"任务1,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务2,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务3,当前线程%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
    NSLog(@"任务4,当前线程%@", [NSThread currentThread]);
    });
    //dispatch_sync 如果是添加的同步任务,任务同步执行全在主线程中处理,

}

//分组任务,

  • (IBAction)handleGroup:(UIButton *)sender {
    //1.获取并发队列,
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.创建分组
    dispatch_group_t group = dispatch_group_create();
    //3.往队列中添加分组任务
    dispatch_group_async(group, queue, ^{
    NSLog(@"请求0~1M数据, 当前线程%@", [NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
    NSLog(@"请求1~2M数据, 当前线程%@", [NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
    NSLog(@"请求2~3M数据, 当前线程%@", [NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
    NSLog(@"请求3~4M数据, 当前线程%@", [NSThread currentThread]);
    });
    //所有分组任务完成之后触发
    dispatch_group_notify(group, queue, ^{
    //拼接分段数据
    NSLog(@"拼接分段数据, 当前线程为%@", [NSThread currentThread]);
    });
    }
    //整个应用程序运行期间,只执行一次
    //初始化方法和单例
  • (IBAction)handleOnce:(UIButton *)sender {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    //存放只会执行一次的代码,比如单例对象的创建
    });
    }
    //障碍
  • (IBAction)handleBarrier:(UIButton *)sender {
    //1.获取队列
    // dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //如果要加障碍任务,必须要使用自己创建的队列
    dispatch_queue_t queue = dispatch_queue_create("dd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
    NSLog(@"A 写入");
    });
    dispatch_async(queue, ^{
    NSLog(@"B 写入");
    });
    dispatch_async(queue, ^{
    NSLog(@"C 写入");
    });
    dispatch_barrier_async(queue, ^{
    NSLog(@"障碍, 读取数据");
    });
    dispatch_async(queue, ^{
    NSLog(@"D 写入");
    });
    dispatch_async(queue, ^{
    NSLog(@"E 写入");
    });
    dispatch_async(queue, ^{
    NSLog(@"F 写入");
    });

}
//延迟

  • (IBAction)handleDelay:(UIButton *)sender {
    //1.
    double second = 2.0;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(second * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    //存放延迟10秒之后执行的任务
    NSLog(@"Duck");
    });
    }
    //重复执行的任务
  • (IBAction)handleApply:(UIButton *)sender {
    //并行队列
    // dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //串行队列
    dispatch_queue_t queue = dispatch_queue_create("cc", DISPATCH_QUEUE_SERIAL);
    NSArray *arr = @[@"aa", @"bb", @"cc", @"dd", @"ee", @"ff", @"gg", @"hh", @"ii", @"kk"];
    //如果每次只执行一个任务,则在主线程中执行,如果并发执行多个,在主线程之外,还会分配子线程
    dispatch_apply(arr.count, queue, ^(size_t index) {
    NSLog(@"任务%lu 当前线程%@", index + 1, [NSThread currentThread]);
    NSLog(@"%@", arr[index]);
    });

}

</code>

相关文章

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • 扩展GCD(求逆元,解同余方程等等)

    首先要知道gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(|a|,|b|)=gcd(b,a%b)...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • 浅析GCD

    GCD目录: 1. GCD简介 为什么要用GCD呢? GCD可用于多核的并行运算GCD会自动利用更多的CPU内核(...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • iOS 多线程--GCD

    一、GCD基本介绍 1.GCD简介 GCD是Grand Central Dispatch的缩写,GCD是苹果推出的...

  • 自用算法模板(JAVA版)

    一、数论 1)GCD GCD(求最大公约数) QGCD(快速GCD) extGCD(拓展GCD,解决ax + by...

  • GCD介绍

    一、GCD简单介绍 什么是GCD GCD优势 任务和队列 GCD有2个核心概念 GCD的使用就2个步骤 将任务添加...

  • 7.多线程基础(七)GCD加强

    1.GCD串行队列和并发队列 2.GCD延时执行 3.GCD线程组:(的作用) 4.GCD定时器: GCD的实现 ...

网友评论

      本文标题:GCD

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