GCD(Grand Central Dispatch)应该是我们开发中最常用到的多线程解决方案,是苹果公司专门为多核的并行运算提出的解决方案,是基于C语言的,提供了很多非常强大的函数。

GCD的优势

1.会自动利用更多的CPU内核(从iPhone4s开始是双核,iPhone7系列是4核)。

2.会自动管理线程的创建、生命周期、销毁等,不需要写一句关于线程的代码。

3.将任务添加到队列中,GCD会自动从队列中将任务取出,放到对应的线程中执行。

进程与线程

1.简单点说一个APP就是一个进程,例如微信、迅雷都分别是一个进程。

2.一个进程可以拥有多条线程。当我们打开APP时系统会自动帮我们创建一条主线程,当我们要让APP干点别的事时,例如刷新数据,就要开启一条子线程来向服务器请求数据,所以一个进程可以拥有多条线程。(并不是让APP干什么事,都会开启子线程,这里只是为了解释方便,才这么说的。)

队列(queue)

队列就是用来存放任务的,任务就是我们让APP干的事,例如下载图片,刷新数据等,都是任务。我们使用GCD,只要把任务放到队列中就可以了,系统会自动帮我们创建线程,调度任务。任务的调度原则遵行FIFO原则,就是哪个任务先放进队列中,就先执行。队列分为串行队列,和并行(并发)队列。

1.串行队列 : 就是队列里的任务必须一个一个往下执行。例如我们要执行A、B、C 三个任务,我们把这三个任务放到串行队列中,必须是A执行完,B才执行,B执行完C才执行。

创建串行队列有两种方法:

(1)自定义队列

代码:

 // 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("doujiangyoutiao", DISPATCH_QUEUE_SERIAL);
// 添加任务A
dispatch_async(queue, ^{
NSLog(@"执行任务A");
});
// 添加任务B
dispatch_async(queue, ^{
NSLog(@"执行任务B");
});
// 添加任务C
dispatch_async(queue, ^{
NSLog(@"执行任务C");
});

日志

2016-11-04 14:00:06.546 TTTTTTTTTT[11059:128030] 执行任务A
2016-11-04 14:00:06.546 TTTTTTTTTT[11059:128030] 执行任务B
2016-11-04 14:00:06.547 TTTTTTTTTT[11059:128030] 执行任务C

1)“doujiangyoutiao”是这个队列的名字;

2)DISPATCH_QUEUE_SERIAL表示创建的是一条串行对列。

(2)主队列

dispatch_queue_t queue =dispatch_get_main_queue();

得到主队列,主队列是串行队列,主队列中的任务默认都在主线程中执行。

2.并行队列:就是队列里的任务可以一齐执行。还是举执行A、B、C 三个任务的例子。我们把三个任务放到并行队列中,这三个任务可以一起执行,所以不一定谁先下载完。串行队列里一定是A先下载完。

代码:

- (void)viewDidLoad {
[super viewDidLoad]; // 创建并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 添加任务A
dispatch_async(queue, ^{
NSLog(@"执行任务A");
});
// 添加任务B
dispatch_async(queue, ^{
NSLog(@"执行任务B");
});
// 添加任务C
dispatch_async(queue, ^{
NSLog(@"执行任务C");
});
}

每次打印的日志应该都不一样,有兴趣可以多试几次。

2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131391] 执行任务B
2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131393] 执行任务C
2016-11-04 14:09:03.871 TTTTTTTTTT[11356:131390] 执行任务A

创建并行队列有两种方法:

(1)看上面代码得到全局并行队列,不需要我们创建,我们一般用这个。第一个参数表示这个队列的优先级

(DISPATCH_QUEUE_PRIORITY_HIGH、DISPATCH_QUEUE_PRIORITY_DEFAULT、DISPATCH_QUEUE_PRIORITY_LOW、DISPATCH_QUEUE_PRIORITY_BACKGROUND),用第二个就可以。第二个参数还没开发出来,没有用,默认写0即可。

(2)自定义队列

dispatch_queue_t queue=dispatch_queue_create("fuhang",DISPATCH_QUEUE_CONCURRENT);

"fuhang"为并发队列的名字,后面表示创建的队列为并行队列。

注意:

  1. 并发队列里的任务一定会一起执行嘛?

    答:肯定不会啊。如果并发队列里有100个任务,一起执行就得创建100条线程,那不得累死CPU啊!任务少了会一起执行,任务多了对先一起执行一部分。
  2. 线程并发???

    答:错。串行并发是形容队列的!!!线程没有,线程里的任务都是一个一个的往下执行,不可能多个任务一起执行。

同步和异步

同步:会堵塞当前线程,队列里的任务执行完,任务所在的线程才会往下执行。其实说白了就是插队。

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

第一个参数是队列,第二个参数是要往队列里添加的任务。



  异步:不会堵塞当前线程。

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

同上。

  同步和异步就是用来判断是否要在当前线程的基础上创建新的线程。同步不会创建新的线程,队列里的任务在当前线程中执行,所以会堵塞当前线程。但是异步也不是一定会创建新的线程,这要根据CPU的使用情况来看,但是大多数情况会创建一个线程。

iOS多线程之4.GCD简介的更多相关文章

  1. iOS多线程之6.GCD的其他用法

    队列组   让队列里的任务同时执行,当任务都执行完毕时,再以通知的形式告诉程序员.举例,同时下载两张图片,两张图片都下载完了,在合成成一张. 代码: #import "ViewControl ...

  2. iOS多线程之5.GCD的基本使用

      上一篇文章我对GCD的几个基本概念做了介绍,但是大家看完了可能觉得对理解GCD并没有什么卵用.其实会用GCD其实很简单,只要记住两条就可以了. 1. 主队列里的任务必须在异步函数中执行.   主队 ...

  3. iOS多线程之8.NSOPeration的其他用法

      本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...

  4. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  5. iOS多线程之Thread

    多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...

  6. iOS多线程之GCD、OperationQueue 对比和实践记录

    [toc] 简介      在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...

  7. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  8. iOS多线程之GCD详解

    GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制.也是目前苹果官方推荐的多线程开发方法.iOS三种多线程开发中GCD是抽象层次最高的.当然用起来也是最简单的. ...

  9. 【原】iOS多线程之NSThread、NSOperationQueue、NSObject和GCD的区别

    区别: Thread: 是这几种方式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间, 它们拥有对数据相同的访问权限. ...

随机推荐

  1. SQL 里解析 XML 格式 字段 信息

    DECLARE @ItemMessage XML ),zje ),yfje ),bcje ),URL ),Remark )) SET @ItemMessage=N'<List> <i ...

  2. JAVA基础代码分享--求圆面积

    问题描述 用户输入圆的半径,计算并显示圆的面积 代码分享 /** * @author hpu-gs * 2015/11/25 */ public class Circle { public stati ...

  3. Huffman树进行编码和译码

    //编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  4. Android仿qq聊天记录长按删除功能效果

    最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没 ...

  5. 数据可视化-EChart2.0使用总结2

    接上一篇博客,这篇博客主要讨论EChart里面的散点图.气泡图和雷达图.   4.散点图-Scatter Chart 适合场景:三维数据集,但是只有两个维度需要比较.比较的是X轴和Y轴的数据,第三个数 ...

  6. android view 中各函数的执行顺数

    这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: pa ...

  7. C++ 使用 opencv 库时 Point 在已经引入了 core.hpp 的情况下仍无法识别的可能原因

    引入了 core.hpp 是不够的.请加上 using namespace cv;

  8. composer安装yii2问题总结

    今天周六,在家安装yii2的advanced版本, 过程有些坎坷, 不过最后总算安装好了. 总结一下, 主要遇到下面两个问题: 1, 下载速度慢, 主要原因是网络问题 下载yii2时, 模板(除了ve ...

  9. git取消跟踪文件

    取消跟踪文件: $git rm --cached FILENAME 取消跟踪目录: $git rm --cached FILENAME -r

  10. springmvc原理

    今天面试碰到一个特别恶心的公司面试官.是一个金融公司,过去后告诉我2点上班,带我去见经理.经理找人面试,看起来没有hr,经理直接看简历招人.经理上来就问我是xxx大学的,我说是,然后等面试官.面试官来 ...