21、GCD

2020-12-09  本文已影响0人  ChenL
GCD的优势:

重点
将任务添加到队列,并指定任务执行的函数

GCD的核心

GCD的核心 主要是由任务 + 队列 + 函数 构成

日常开发中,GCD一般写成下面的形式:

 dispatch_async( dispatch_queue_create("com.xxx.Queue", NULL), ^{
   NSLog(@"GCD基本使用");
});

拆分如下:

//********GCD基础写法********
//创建任务
dispatch_block_t block = ^{
    NSLog(@"hello GCD");
};

//创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.xxx.Queue", NULL);

//将任务添加到队列,并指定函数执行
dispatch_async(queue, block);
函数与 队列

一、函数:

在GCD 中 执行任务的方式 有两种,同步执行异步执行,分别对应 函数dispatch_sync 和 异步函数 dispatch_async

1、 同步执行,对应函数 dispatch_sync

综上,两种执行方式的区别:

一、队列:

串行队列 && 并行队列

多线程中所说的 队列 是指 执行任务的等待队列,即用来存放任务的队列。队列 是一种特殊的 线性表,遵循 先进先出(FIFO)原则,即新任务总是被 插入到对尾,而任务的读取 从队首开始读取。每读取一个任务,则队列中释放一个任务。

image.png

在GCD 中,队列主要分为串行队列 和 并行队列


image.png

1、串行队列 :

每次 只有一个任务被执行,等待上一个任务执行完毕再执行下一个,即 只开启一个线程(同一时刻只调度一个任务执行)

// 串行队列的获取方法
dispatch_queue_t serialQueue1 = dispatch_queue_create("com.xxx.Queue", NULL);
dispatch_queue_t serialQueue2 = dispatch_queue_create("com.xxx.Queue", DISPATCH_QUEUE_SERIAL);

2、并行队列:

一次可以并发执行多个任务,即 开启多线程,并同时执行多个任务(同一时刻可以调度多个任务执行)

// 并发队列的获取方法
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.xxx.Queue", DISPATCH_QUEUE_CONCURRENT);

3、主队列:

GCD中提供的特殊的串行队列

//主队列的获取方法
dispatch_queue_t mainQueue = dispatch_get_main_queue();

4、全局并发队列:

GCD提供的默认的并发队列

第一个参数:队列优先级,默认优先级为DISPATCH_QUEUE_PRIORITY_DEFAULT=0,在ios9 之后,已经被服务质量(quality-of-service) 取代

第二个参数:0

//全局并发队列的获取方法
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

//优先级从高到低(对应的服务质量)依次为

日常开发中,全局队列+并发队列,一般是这样配合使用的:

//主队列 + 全局并发队列的日常使用
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //执行耗时操作
        dispatch_async(dispatch_get_main_queue(), ^{
            //回到主线程进行UI操作
        });
    });
函数与 队列的不同组合

1、 串行队列+同步函数

任务:按顺序执行,任务一个接一个的在当前线程执行,不会开辟新线程。

2、串行队列+异步函数

任务:按顺序执行,任务一个接一个的执行,会开辟新线程

3、并发队列+同步函数

任务:按顺序执行,任务一个接一个的执行,不开辟新新线程

4、并发队列+异步函数

任务:乱序执行,任务执行无顺序,会开辟新线程

5、主队列+同步函数

造成死锁,任务 :互相等待,造成死锁

.png

造成死锁的原因分析如下:

死锁现象

6、主队列+异步函数

任务 按顺序执行,任务一个接一个的执行,不开辟线程

7、全局并发队列+ 同步函数

按顺序执行,任务一个接一个的执行,不开辟新线程

8、 全局并发队列+异步函数

任务 乱序执行,会开辟新线程

上一篇 下一篇

猜你喜欢

热点阅读