iOS多线程之4.GCD简介
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"为并发队列的名字,后面表示创建的队列为并行队列。
注意:
- 并发队列里的任务一定会一起执行嘛?
答:肯定不会啊。如果并发队列里有100个任务,一起执行就得创建100条线程,那不得累死CPU啊!任务少了会一起执行,任务多了对先一起执行一部分。 - 线程并发???
答:错。串行并发是形容队列的!!!线程没有,线程里的任务都是一个一个的往下执行,不可能多个任务一起执行。
同步和异步
同步:会堵塞当前线程,队列里的任务执行完,任务所在的线程才会往下执行。其实说白了就是插队。
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
第一个参数是队列,第二个参数是要往队列里添加的任务。
异步:不会堵塞当前线程。
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
同上。
同步和异步就是用来判断是否要在当前线程的基础上创建新的线程。同步不会创建新的线程,队列里的任务在当前线程中执行,所以会堵塞当前线程。但是异步也不是一定会创建新的线程,这要根据CPU的使用情况来看,但是大多数情况会创建一个线程。
iOS多线程之4.GCD简介的更多相关文章
- iOS多线程之6.GCD的其他用法
队列组 让队列里的任务同时执行,当任务都执行完毕时,再以通知的形式告诉程序员.举例,同时下载两张图片,两张图片都下载完了,在合成成一张. 代码: #import "ViewControl ...
- iOS多线程之5.GCD的基本使用
上一篇文章我对GCD的几个基本概念做了介绍,但是大家看完了可能觉得对理解GCD并没有什么卵用.其实会用GCD其实很简单,只要记住两条就可以了. 1. 主队列里的任务必须在异步函数中执行. 主队 ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- iOS多线程之Thread
多线程 • Thread 是苹果官方提供的,简单已用,可以直接操作线程对象.不过需要程序员自己管理线程的生命周期,主要是创建那部分 优缺点 面向对象,简单易用 直接操作线程对象 需要自己管理线程生命周 ...
- iOS多线程之GCD、OperationQueue 对比和实践记录
[toc] 简介 在计算的早期,计算机可以执行的最大工作量是由 CPU 的时钟速度决定的.但是随着技术的进步和处理器设计的紧凑化,热量和其他物理约束开始限制处理器的最大时钟速度.因此,芯片制 ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- iOS多线程之GCD详解
GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制.也是目前苹果官方推荐的多线程开发方法.iOS三种多线程开发中GCD是抽象层次最高的.当然用起来也是最简单的. ...
- 【原】iOS多线程之NSThread、NSOperationQueue、NSObject和GCD的区别
区别: Thread: 是这几种方式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间, 它们拥有对数据相同的访问权限. ...
随机推荐
- ModelDataExchange - Import
ModelDataExchange - Import eryar@163.com Abstract. The ModelDataExchange import utility enables the ...
- 使用maven来管理java项目
初学maven,简单总结一下学习心得,若有不对的地方,欢迎各位大神给我指正~ 总结分为6个部分 maven概述 maven安装 maven项目结构和创建方法 maven配置文件settings.xml ...
- 【记录】ASP.NET MVC RegisterBundles
1. Install the package from nuget Install-Package Microsoft.AspNet.Web.Optimization 2,BundleConfig 配 ...
- canvas学习和面向对象(二)
Canvas 学习(二) 上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形. 现在开始绘制图片和动画帧,以及面向对象的升级版本. 还是一样,看代码,所有的代码都托管在git ...
- 在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容
一个很长的标题,实现的功能就是尽量使用非人力的方式模拟人去做一件事情,为了便于记录,将他们输出成文件方便查阅. 图形界面方式,使用微软自己的ConnMaker.exe,或者Microsoft 数据连接 ...
- ie6,ie7,ie8 css bug兼容解决记录
ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...
- 谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式
作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题. [出现频率] [关键考点] MVC的含义 MVC的结构 ...
- .NET 内存基础(通过内存体验类型、传参、及装箱拆箱)
该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域 ...
- Devexpress WPF Theme Editor 02
Devexpress WPF Theme Editor 01 对于上次我们生成的主题 开始添加到我们的项目中. 运行Visual Studio和打开一个WPF解决方案,你想申请的主题. 添加的主题集会 ...
- jquery制作论坛或社交网站的每天打卡签到特效
效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...