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的使用主要分为三步:创建代码块;选择或创建合适的分发队列;(同步.异步方式)向分发队列提交任 ...
随机推荐
- Mybatis对MySQL中BLOB字段的读取
1.在sqlMapConfig中,定义一个typeHandlers <typeHandlers> <typeHandler jdbcType="BLOB" jav ...
- LoRaWAN协议(三)--Server端数据协议
LoRaWAN Server 端架构 LoRaWAN 的server包括 NS(Network server).AS(application server).CS(Custom server).... ...
- Nginx: could not build the server_names_hash 解决办法
# /etc/init.d/nginx reload * Reloading nginx configuration nginx [fail] # nginx -t nginx: [emerg] co ...
- 【转载】uclibc和glibc的差别
转载自:http://blog.163.com/huangnan0727@126/blog/static/30626184201042022011225/ CC的标准库,就是glibc这个库,里面有G ...
- TypeWonder – 在任何网站上实时预览字体效果
TypeWonder 让网页字体的选择过程变得轻松愉快.它可以帮助您在任何网站上快速测试 Web 字体效果!输入网站网址,就能够即时预览的字体的实际效果,还可以从数百种字体中进行挑选,您还可以得到所需 ...
- LeetCode——Jump Game II
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- OpenCV开发环境配置-Windows/MinGW/Clion/CMake
临时更换成了TDM-GCC,和mingw类似,这里只是声明一下. 由于opencv下载下来的.exe安装包实际上是没有mingw(gcc)匹配的/动静态库,因此这些东西需要我们自己使用mingw编译. ...
- Mysql学习笔记(十四)备份与恢复
学习内容: 1.数据库的重要数据备份... 2.什么时候需要使用到数据库备份.. 3.如何恢复备份的数据.. 1.备份: 说到备份,相比大家都不应该陌生,比如说我们平时在为我们的电脑重新做系统的时候, ...
- 0406.复利计算器5.0版-release
复利计算器5.0-release 目录 项目简介 Github链接推送 客户需求 新增需求分析 项目设计 效果演示 操作说明 程序结构 结对分工 合作照片 总结 1.项目简介 项目名称:复利计算器 目 ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...