GCD详解

作者: 任梦RM | 来源:发表于2016-11-30 13:15 被阅读24次

GCD的基本思想就是将操作(任务)放在队列中去执行,队列负责调度任务执行,所在的线程以及具体的执行时间,队列的特点是先进先出,新添加至队列的操作(任务)都会排在队尾。
GCD的函数都是以dispatch开头的,dispatch的意思是“分配、调度”

  • 串行队列中的任务会按顺序执行

  • 并行队列中的任务通常会并发执行,而且无法确定任务的执行顺序

  • dispatch_async表示异步操作,异步操作会新开辟线程来执行任务,而且无法确定任务的执行顺序

  • dispatch_sync表示同步操作,同步操作不会新开辟线程

1. 在串行队列中执行同步任务:不会新建线程,按顺序执行任务(毫无用处)
    //1 .创建一个串行队列
    dispatch_queue_t serailQueue = dispatch_queue_create("serailQueue", DISPATCH_QUEUE_SERIAL);
    //2.在队列中同步执行,不具有开启新线程的能力+
    dispatch_sync(serailQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_sync(serailQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_sync(serailQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });
2. 在串行队列中执行异步任务,会新建线程,按顺序执行任务(非常有用)
    //1.创建串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    //2. 异步执行任务 ,可以创建新线程
    dispatch_async(serialQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });
3. 在并行队列中执行同步任务:不会新建线程,按顺序执行任务(几乎没用)
    // 1.创建并行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_CONCURRENT);
    // 2. 同步执行任务,不具有创建新线程的能力
    dispatch_sync(serialQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_sync(serialQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_sync(serialQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });
4. 在并行队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序(有用,但是很容易出错)
    // 1.创建并行队列
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
    // 2.异步执行任务
    dispatch_async(concurrentQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });

全局队列:

全局队列是系统的,直接拿过来就可以用,与并行队列类似,但是不能指定队列的名字,调试时无法确认任务所在队列。

  • 在全局队列中执行同步任务:不会新建线程,按顺序执行任务
  • 在全局队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序
    // 1.创建并行队列
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
    // 2.异步执行任务
    dispatch_async(concurrentQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });

主队列:

每一个应用程序只有一个主线程即只有一个主队列
为什么需要再主线程上执行任务呢?因为在ios开发中,所有UI的更新任务都必须在主线程上执行。
主队列中的操作都是在主线程中执行的,不存在异步的概念
主队列中添加的同步操作永远不会被执行(会死锁)

    //1.获取主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
  
    dispatch_async(mainQueue, ^{
                NSLog(@"1 = %@",[NSThread currentThread]);
            });
    dispatch_async(mainQueue, ^{
                NSLog(@"2 = %@",[NSThread currentThread]);
            });
    dispatch_async(mainQueue, ^{
                NSLog(@"3 = %@",[NSThread currentThread]);
            });

GCD 组的应用和监听

    //1. 找到全局的并行队列
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
    //2.找到组
    dispatch_group_t group = dispatch_group_create();
    //3.添加任务
    dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"1 = %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"2 = %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"3 = %@",[NSThread currentThread]);
    });
    // 4. 监听完成
    dispatch_group_notify(group, concurrentQueue, ^{
        NSLog(@"任务全部完成");
    });

相关文章

  • iOS多线程:GCD Group、Barrier和NSOpera

    GCD系列文章 GCD任务和队列使用详解 本文主要总结GCD Group、Barrier和NSOperationQ...

  • Swift基础--线程队列

    参考:青玉伏案博客--GCD详解 线程 队列

  • iOS多线程之GCD详解

    原文链接:整理多线程:GCD详解,如有侵权立即删除 一、GCD简介 为什么要用GCD呢? 二、GCD任务和队列 2...

  • iOS GCD详解《二》

    GCD详解 《一》[https://www.jianshu.com/p/7e83243a12a6]iOS GCD信...

  • 详解GCD<2>-dispatch_barrier

    dispatch_barrier 讲完了GCD详解一。我们来看看一个不太常用的GCD。dispatch_barri...

  • iOS多线程 基本使用实例

    NSThread GCD GCD 详解:http://www.jianshu.com/p/d1f9b2a7b0a8...

  • GCD的使用

    GCD的详解iOS多线程--彻底学会多线程之『GCD』 GCD线程之间的通讯 一般在主线程里面刷新UI 点击、滚动...

  • GCD中的串行,并行,同步,异步详解

    gcd中的串行,并行,同步,异步详解 1、gcd中同步与异步的区别: gcd中的线程是由一个线程池来管理的,这个池...

  • GCD详解

    一 使用步骤 创建队列(串行队列或并发队列) 调用函数(同步或异步) 二 重要概念 1,同步和异步 同步或异步最大...

  • GCD详解

    学习 GCD 之前,先来了解 GCD 中两个核心概念:任务和队列。 任务:就是执行操作的意思,换句话说就是你在线程...

网友评论

      本文标题:GCD详解

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