概述

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_asyncdispatch_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的更多相关文章

  1. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  2. iOS开发系列

    因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...

  3. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  4. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  5. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  6. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  7. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  8. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  9. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

随机推荐

  1. bzoj1005题解

    [解题思路] 引理:Prufer编码 定义:不断删除树中度数为1的最小序号的点,并输出与其相连的节点的序号,直至树中只有两个节点,所得输出序列即为Prufer编码. 性质:任意一棵n节点的树都可以用长 ...

  2. 回滚树形dp(按dfs序dp)——hdu6035

    本题前面的操作别的博客里都有.难点在于颜色ci的贡献,如何一次dfs求出答案 先来考虑如何在一次dfs中单独对颜色i进行计算 用遍历dfs序的方式,在深搜过程中,碰到带有颜色 i 的点 u,u每个颜色 ...

  3. 57 c++ 读取二进制文件: 以.raw后缀的TDF_Voxel_Size文件为例

    0 引言 毕业设计中用到了.raw格式的文件,需要将该文件按照M*N*P的矩阵格式加载到内存中.采用 #include <fstream> 中的FILE* 加载,并针对数据占用字节数,以 ...

  4. NOIp2018集训test-9-1(am)

    1.最大值 可以用FWT水过去,李巨写了FWT结果中途爆int了炸了几十分好像. 我乱搞了一下把除了大数据有or的搞出来然后90,还是蛮划算的.我yy的做法: 1.xor 字典树上贪心, 一开始我打了 ...

  5. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  6. NX二次开发-UFUN创建倒圆UF_MODL_create_blend

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN S ...

  7. iOS ARC使用总结

    在iOS ARC模式下,编译器会自动插入release 有些时候程序出现 message sent to deallocated object的时候,你不知道什么原因. 一种原因是因为你在ARC下使用 ...

  8. 史上最全Redis面试题及答案。

    花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案- 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检 ...

  9. 2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19)

    2019-2020 Saint-Petersburg Open High School Programming Contest (SpbKOSHP 19) easy: ABFGHI medium-ea ...

  10. Android笔记之调用系统相机拍照

    参考链接: 拍照  |  Android Developers, Android相机拍照方向旋转的解决方案:ExifInterface - 简书 Demo链接:https://pan.baidu.co ...