iOS多线程GCD之队列和任务详解(实例代码验证篇)

时间:2022-10-12 05:17:50

一、初步了解什么是GCD?

GCD 全称Grand Central Dispatch(队列调度)
是一套低层API,提供了⼀种新的方法来进⾏并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务,然后提交⾄⼯作队列来并发的或者串⾏的执行。
GCD是C实现,⽐NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分 并发任务会像NSOperationQueue那样基于系统负载来合适地并发进⾏,而串⾏行队列同一时间只执行单一任务。 GCD的API很大程度上基于block

二、GCD如何实现?

GCD主要由队列和任务两部分来实现,许多同学对队列和线程容易搞混,这里把它分类来详述:
1.队列主要包含三种:主线程队列、并行队列、串行队列
2.任务主要包含两种:异步任务和同步任务
多线程执行过程就是把任务放在队列中去执行的过程
(在计算机操作系统中对异步和同步有很深入的概念和定义,并影响到计算机系统有单线程到多线程的过渡发展,其中牵涉到线程切换、时间片等概念。但在GCD这里我们只做大致使用区别)
队列:
并行队列 :在队列中的多个任务(线程) 同时执行 (不按顺序执行)
串行队列: 在队列中的多个任务(线程)排队 依次执行(按顺序执行)

任务:
同步(sync) 和 异步(async) 的主要区别在于会不会阻塞当前线程,直到 Block 中的任务执行完毕!
iOS多线程GCD之队列和任务详解(实例代码验证篇)

如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
如果是 异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。

好了 ,不理解也没关系,我在代码中给你来说明和验证;

1、队列 (主要三个队列,为更好理解队列,队列中全部先放入异步任务)

1.主线程队列

主线程队列 内部执行任务是串行的同步操作
主线程队列不需要我们创建,通过dispatch_get_main_queue()方法获得

    dispatch_queue_t  queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{

    });
  或者
    dispatch_async(dispatch_get_main_queue(), ^{

    });

实例:

iOS多线程GCD之队列和任务详解(实例代码验证篇)

-(void)mainQueue{
      //异步任务
        dispatch_async(dispatch_get_main_queue(), ^{
            for (NSInteger i = 0; i < 10; i++) {
                NSLog(@"主线程任务2_i:%ld",i);
            }
        });
}

实例输出:

iOS多线程GCD之队列和任务详解(实例代码验证篇)
Snip20161012_2.png

小结:数据在主线程中按顺序输出

2.创建串行队列

// 创建一个用户串行队列 dispatch_queue_create("com.gcd", NULL),"com.gcd":队列名是一个C字符串,没有特别的要求,Apple建议用倒装的标识符来表示 
//串行队列内部也是串行操作
    dispatch_async( dispatch_queue_create("com.gcd", NULL), ^{
          //任务
      });
     // 我们自己创建的队列,我们需要自己销毁(非arc 需要销毁)
      //dispatch_release(queue);


作者:远处山谷来的清风
链接:https://www.jianshu.com/p/b244476ce561
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。