iOS开发系列-GCD
概述
GCD是苹果公司为多核的并行运算提出的解决方案。全称是Grand Central Dospatch。纯C语言,提供了非常多强大的函数。
GCD自动管理线程的声明周期(创建线程、调度任务、销毁线程)。面向开发者只需要告诉GCD执行的任务。
GCD的核心概念
- 任务-执行的操作
- 队列-存放任务
GCD将任务添加进队列中,GCD会自动将队列中的任务取出放到对应的线程执行。任务的取出遵循队列的FIFO原则。
GCD基本使用
在使用GCD首先得创建队列。队列是用来添加任务的。GCD队列主要分两种类型:串行队列
和并发队列
。队列类型决定队列中任务执行方式。
如果是串行队列,队列中的任务执行时按顺序的执行。先添加进去的任务执行完毕,后面的任务再被取出放进对应的线程执行。
如果是并发队列,队列中的任务执行可以支持同时将队列中的多个任务同时放在不同线程并发执行。
// label 队列的名字
// 队列的类型 DISPATCH_QUEUE_CONCURRENT并发 DISPATCH_QUEUE_SERIAL串行
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL);
当任务添加进队列就需要执行了。GCD提供了两个函数执行队列中的任务。dispatch_async
和dispatch_sync
。这两个函数只决定有没有开线程的能力。
- dispatch_async具备开启新的线程执行任务。
- dispatch_sync不具备开启新的线程,只能在当前线程执行任务。
总结:
* dispatch_async + 并发队列: 开启多条线程并发执行任务
* dispatch_async + 串行队列: 开启一条线程串行发执行任务
// 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL);
// 将任务添加三个队列
dispatch_async(queue, ^{
// 添加任务1
NSLog(@"----------------------1%@", [NSThread currentThread]);
NSLog(@"----------------------1%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务2
NSLog(@"----------------------2%@", [NSThread currentThread]);
NSLog(@"----------------------2%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务3
NSLog(@"----------------------3%@", [NSThread currentThread]);
NSLog(@"----------------------3%@", [NSThread currentThread]);
});
上面代码中我们往串行队列中添加了三个任务,使用了GCD异步函数执行,具备开线程的能力。系统此时会开启一条子线程按顺序将三个任务放进子线程中执行.
同理如果我们将队列改为并发队列。系统会开启多条线程分别将三个任务放入不同线程同时执行。开启的线程条数有系统决定。
上面通过GCD将我们的任务放在子线程中执行。队列使我们自己创建的,其实系统提供了全局的队列供我们使用。dispatch_get_main_queue和dispatch_get_global_queue
。
/**
* identifier 队列的有先级 通常传递default
* flags 一般传0
*/
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
iOS开发系列-GCD的更多相关文章
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- iOS开发系列
因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
随机推荐
- Python字典列表字段重组形成新的字典
最近遇到这样一个需求,需要将字典列表中的字段进行重组,形成一个新的字典.举个例子吧: l1 = [{"x": 22, "y": 22, "demand ...
- [JZOJ 5817] 抄代码
题意: 给定2T个串,带修的判断两个串是否按规则一样?? 思路: 两个串是"抄袭的"肯定就是: 1.长度一样. 2.特殊字符位置一样 3.对于每个\(x\)在两个串中出现位置一样, ...
- 秒懂机器学习---k-近邻算法实战
秒懂机器学习---k-近邻算法实战 一.总结 一句话总结: k临近算法的核心就是:将训练数据映射成k维空间中的点 1.k临近算法怎么解决实际问题? 构建多维空间:每个特征是一维,合起来组成了一个多维空 ...
- opencv-霍夫直线变换与圆变换
转自:https://blog.csdn.net/poem_qianmo/article/details/26977557 一.引言 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信 ...
- C++的指针常量和常量指针
这2个概念非常容易混淆,即使是老鸟,也有眩晕的时候,写此博文,加深记忆... 指针常量:一个指针,并且它是一个常量,它的值不许被改变: char *const p1 = "Hello!&qu ...
- 剑指offer——22表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- [Java]读取文件方法大全(转载)
1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图 ...
- SimpleDateFormat日期格式
前言 java中使用SimpleDateFormat类的构造函数SimpleDateFormat(String str)构造格式化日期的格式,通过format(Date date)方法将指定的日期对象 ...
- pip修改官方源为豆瓣源
参考地址: https://www.jianshu.com/p/10a23d6a93c6 1.临时修改 pip install pythonModuleName -i https://pypi.dou ...
- Activiti学习笔记9 — UserTask共有任务的使用
1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 2.发布一个流程 ...