IOS GCD 浅析
GCD是苹果公司为多核的并行运算提出的解决方案
GCD会自动利用更多的CPU内核(比如双核、四核)
GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
GCD中有2个核心概念
(1)任务:执行什么操作
GCD的使用就2个步骤
(1)定制任务
将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行
三、执行任务
1.GCD中有2个用来执行任务的函数
说明:把右边的参数(任务)提交给左边的参数(队列)进行执行。
(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
参数说明:
queue:队列
(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
2.同步和异步的区别
同步:在当前线程中执行
1.队列的类型
GCD的队列可以分为2大类型
(1)并发队列(Concurrent Dispatch Queue)
可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效
(2)串行队列(Serial Dispatch Queue)
让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
2.补充说明
有4个术语比较容易混淆:同步、异步、并发、串行
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发:多个任务并发(同时)执行
//
// ViewController.m
// CX-GCD
//
// Created by ma c on 16/3/15.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //自定义队列 [self queueOne];
[self queueTwo];
[self queueThree];
[self queueFour]; }
-(void)queueOne{ //串行同步 - 按顺序执行 立即执行 不开辟新线程
//*注意* "xubaoaichiyu" 前不要加"@" 因为要求传入char
dispatch_queue_t queueOne = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL);//定义为串行队列
//同步
NSLog(@"开始");
dispatch_sync(queueOne, ^{ NSLog(@"One->%@",[NSThread currentThread]); });
dispatch_sync(queueOne, ^{ NSLog(@"Two->%@",[NSThread currentThread]); });
NSLog(@"结束"); }
-(void)queueTwo{ //串行异步 - 按顺序实行 不立即之执行 开辟新线程
dispatch_queue_t queueTwo = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL);
//异步
NSLog(@"开始");
dispatch_async(queueTwo, ^{ NSLog(@"One->%@",[NSThread currentThread]); });
dispatch_async(queueTwo, ^{ NSLog(@"Two->%@",[NSThread currentThread]); });
dispatch_async(queueTwo, ^{ NSLog(@"Three->%@",[NSThread currentThread]); });
NSLog(@"结束"); }
-(void)queueThree{ //并行同步 - 不安顺序执行 立即执行 不开辟新线程
dispatch_queue_t queueThree = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_CONCURRENT);//定义为串行队列
//同步
NSLog(@"开始");
dispatch_sync(queueThree, ^{ NSLog(@"One->%@",[NSThread currentThread]); });
dispatch_sync(queueThree, ^{ NSLog(@"Two->%@",[NSThread currentThread]); }); NSLog(@"结束"); }
-(void)queueFour{ //并行异步 - 不按顺序执行 不立即执行 开辟新空间
dispatch_queue_t queueFour = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_CONCURRENT);
//异步
NSLog(@"开始");
dispatch_async(queueFour, ^{ NSLog(@"One->%@",[NSThread currentThread]); });
dispatch_async(queueFour, ^{ NSLog(@"Two->%@",[NSThread currentThread]); });
dispatch_async(queueFour, ^{ NSLog(@"Three->%@",[NSThread currentThread]); });
NSLog(@"结束"); } @end
分组测试结果:
1)串行同步

 

主队列及其他一些方法(这里就不实现代码了):
//
// ViewController.m
// CX-GCD Two
//
// Created by ma c on 16/3/15.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //主队列 串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//延迟
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, * NSEC_PER_SEC);
dispatch_after(time, mainQueue, ^{
NSLog(@"我来晚了两秒");
});
// dispatch_barrier_async -> 在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行.
//异步 按顺序 不立即执行
dispatch_async(mainQueue, ^{
NSLog(@"a-One");
//CGD中的单例
[self onceToken];
});
dispatch_async(mainQueue, ^{
NSLog(@"a-Two");
[self onceToken];
});
dispatch_barrier_async(mainQueue, ^{
NSLog(@"--------分割--------");
});
dispatch_async(mainQueue, ^{
NSLog(@"a-Three");
[self onceToken];
});
//同步 死锁
// NSLog(@"开始");
// dispatch_sync(mainQueue, ^{
// NSLog(@"One");
// });
// dispatch_sync(mainQueue, ^{
// NSLog(@"Two");
// });
// dispatch_sync(mainQueue, ^{
// NSLog(@"Three");
// });
// NSLog(@"结束");
// 执行某个代码dispatch_apply(遍历)
dispatch_queue_t queue = dispatch_queue_create("xubaoaichiyu", DISPATCH_QUEUE_SERIAL);
dispatch_apply(, queue, ^(size_t i) { NSLog(@"%@",@(i)); }); } -(void)onceToken{ static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"onceToken");
}); } @end
全局队列及调度组:
//
// ViewController.m
// CX - GCD Three
//
// Created by ma c on 16/3/15.
// Copyright © 2016年 xubaoaichiyu. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //全局队列
/*
优先级
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, );
//调度组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"Ome"); });
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:];
NSLog(@"Two"); });
//dispatch_group_notify 只有当组内队列结束后才执行
dispatch_group_notify(group, queue, ^{ NSLog(@"Three"); }); } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; } @end
IOS GCD 浅析的更多相关文章
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
		
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
 - iOS GCD基础篇 - 同步、异步,并发、并行的理解
		
1.关于GCD - GCD全称是Grand Central Dispatch - GCD是苹果公司为多核的并行运算提出的解决方案 - GCD会自动利用更多的CPU内核(比如双核.四核) - GC ...
 - iOS GCD之dispatch_semaphore(信号量)
		
前言 最近在看AFNetworking3.0源码时,注意到在 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法 (L681),dispatch_semapho ...
 - ios之gcd浅析
		
A.普通的GCD异步运行与主线程更新写法: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^ ...
 - iOS GCD 编程小结
		
一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...
 - iOS GCD NSOperation NSThread等多线程各种举例详解(拷贝)
		
2年多的iOS之路匆匆而过,期间也拜读来不少大神的博客,近来突然为自己一直做伸手党感到羞耻,是时候回馈社会.回想当年自己还是小白的时候,照着一些iOS多线程教程学,也只是照抄,只知其然.不知其所以然. ...
 - ios - GCD简单小结
		
首先GCD两个名词: 队列 同步异步. 队列: 任务放到队列,队列中的任务执行方式取决于执行队列中任务的方式---同步异步. 串行队列: 任务顺序执行,可以叫阻塞队列.只有前面任务完成才执行后面的. ...
 - iOS GCD 与 NSOperationQueue
		
NSOperationQueue ios NSOperation vs. GCD StackOverflow: NSOperation vs. Grand Central Dispatch Blog: ...
 - IOS GCD 使用 (二)
		
上一节,主要介绍了GCD的基本的概念,这节将用代码深入详细介绍GCD的使用. 一 使用介绍 GCD的使用主要分为三步:创建代码块;选择或创建合适的分发队列;(同步.异步方式)向分发队列提交任 ...
 
随机推荐
- Winform快速开发组件的实现(二)
			
昨天我们一直在做准备工作,最终表单数据需要从数据库里提取,并保存到数据库,今天接着介绍如何做提取.保存和验证. 四.提取并显示信息 在EditForm我们定义一个InfoId属性,用于接收在列表页面打 ...
 - Android之TextView的Span样式源码剖析
			
Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 Spannab ...
 - client/scroll/offset width/height/top/left ---记第一篇博客
			
client/scroll/offset width/height/top/left (盒模型为contentBox,定位原点是元素左上角边框最外层的交点) clientWidth width+左p ...
 - DDD:四色原型中Role的 “六” 种实现方式
			
背景 一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责.四色原型.DIC和“UML事物模式”在不同的维度阐述了这一情况,在代 ...
 - Android学习笔记之dispatchTouchEvent和OnInterceptTouchEvent和OnTouchEvent三个方法之间的联系...
			
PS:好久没有写博客了,项目正式开始启动了,但是怎么也打不起精神来...可能还是不适应放假留校...这下一年只能回家一次了...伤感...写篇博客舒坦下... 学习内容: Android中disp ...
 - iOS实现图像的反色,怀旧,色彩直方图效果
			
反色是与原色叠加可以变为白色的颜色,即用白色(RGB:1.0,1.0,1.0)减去原色的颜色.比如说红色(RGB:1.0,0,0)的反色是青色(0,1.0,1.0).在OPENGL ES中为1. 通过 ...
 - Redis设计与实现-内部数据结构篇
			
题记:这本书是2015年11月份开始读的,大约花了一个多月的时间通读了一遍,最近由于需要对redis做一些深入的了解,因此又花了两个多月仔细精读了一遍,由于本书设计的内容较多,且每部分的内容都比较细致 ...
 - mysql  线上not in查询中的一个坑
			
今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的sql(为了方法说明,表名及查询均做了修改): select * from t2 where t2.course no ...
 - 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy
			
Galaxy Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...
 - out 和 ref 参数修饰符
			
整理自MSDN out: out 关键字通过引用传递参数.这与 ref 关键字相似,只不过 ref 要求在传递之前初始化变量.若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字. ...