GCD有四个概念:串行队列、并行队列、同步、异步四者。

如下简介:

这里不仅给出了不确定性,而且也给出了确定性。对于初学者而言,有时候因为那些不确定的东西所造成的疑问会像没有闸却在疾驰的汽车一样让人惊慌失措,而“确定性”就如同这救命的车闸一样,它能让你豁然开朗。

名称 功能特点 确定性解释 不确定性解释
同步 完成需要做的任务后才会返回,进行下一任务 “任务”,在 GCD 里指的是 Block;在 performSelector 方法中,对应 selector 方法。

同步方法,功能类似dispatch_group_wait ,而 group 指的是所有线程,包括主线程。

不一定是多线程

异步 不会等待任务完成才返回,会立即返回。 异步是多线程的代名词,因为必定会开启新的线程,线程的申请是由异步负责,起到开分支的作用。 --
串行队列 任务依次执行 同一时间队列中只有一个任务在执行,每个任务只有在前一个任务执行完成后才能开始执行。 你不知道在一个Block(任务)执行结束到下一个Block(任务)开始执行之间的这段时间时间是多长,
并行队列 任务并发执行 你唯一能保证的是,这些任务会按照被添加的顺序开始执行。但是任务可以以任何顺序完成 你不知道在执行下一个任务是从什么时候开始,或者说任意时刻有多个Block(任务)运行,这个完全是取决于GCD。
全局队列 隶属于并行队列 不要与 barrier 栅栏方法搭配使用, barrier 只有与自定义的并行队列一起使用,才能让 barrier 达到我们所期望的栅栏功能。与 串行队列或者 global 队列 一起使用,barrier 的表现会和 dispatch_sync 方法一样。  
主队列 隶属于串行队列 不能与 sync 同步方法搭配使用,会造成死循环  

串行队列、并行队列、同步、异步四者的组合:

GCD提供了dispatch queues(调度队列)来执行代码段,这些队列以FIFO(先进先出)的方式来管理你用GCD提交的任务。这保证了你先提交的任务现执行,即第一个任务添加到队列中就第一个开始执行,第二个添加的任务将第二个执行,知道队列的最后一个任务。

--- 同步 异步
串行队列 不会新建线程,依然在当前线程上

类似同步锁,是同步锁的替代方案

✅ 常用

会新建线程,只开一条线程

一条线程就够了

每次使用 createDispatch 方法就会新建一条线程,多次调用该方法,会创建多条线程,多条线程间会并行执行

并行队列 不会新建线程,依然在当前线程上

会新建线程,可以开多条线程

iOS7-SDK 时代一般是5、6条, iOS8-SDK 以后可以50、60条

✅ 常用

参考链接: Why can't we use a dispatch_sync on the current queue?

串行队列中的同步与异步的区别

串行队列能确保顺序执行任务,他们两个的唯一区别在于dispatch_sync只会在 block 完全执行完之后返回,dispatch_async不能确保会在 block 完全执行完之后返回,唯一能确定的是会在被添加到queue 队列后返回。

下面的代码:

dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");

可能会打印 2413 、 2143 、 1234 ,但有一点是可以确认的: 1 总是在 3 之前。

可能的打印:

1
2
3
4 ---------- 2
4
1
3 1
2
3
4 ----------
2
4
1
3

然而下面的代码:

dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");

总会打印:1234

参考链接: Difference between dispatch_async and dispatch_sync on serial queue?

GCD 扫盲篇的更多相关文章

  1. 转摘 MySQL扫盲篇

    一下文章摘自:http://www.jellythink.com/archives/636 MySQL扫盲篇 2014-09-15 分类:MySQL / 数据库 阅读(1412) 评论(1)  为什么 ...

  2. iOS GCD中级篇 - dispatch_group

    1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2 ...

  3. iOS GCD基础篇 - 同步、异步,并发、并行的理解

    1.关于GCD - GCD全称是Grand Central Dispatch  - GCD是苹果公司为多核的并行运算提出的解决方案  - GCD会自动利用更多的CPU内核(比如双核.四核)  - GC ...

  4. 分布式协调服务Zookeeper扫盲篇

    分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...

  5. HTTP/2协议–特性扫盲篇

    HTTP/2协议–特性扫盲篇 随着web技术的飞速发展,1999年制定的HTTP 1.1已经无法满足大家对性能的要求,Google推出协议SPDY,旨在解决HTTP 1.1中广为人知的性能问题.SPD ...

  6. 高级Linux运维工程师必备技能(扫盲篇)

    高级Linux运维工程师必备技能(扫盲篇) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在了解文件系统之前,我们要学习一下磁盘存储数据的方式,大家都知道文件从内存若要持久化存储的 ...

  7. C语言扫盲篇

    C语言扫盲篇 作者:尹正杰 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 一.什么是C语言 C 语言是一种通用的高级语言,最初是由 ...

  8. iOS GCD中级篇 - dispatch_group的理解及使用

    上一篇GCD基础篇,以及同步.异步,并发.并行几个概率的理解 关于dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相 ...

  9. 01--Qt扫盲篇

    Qt扫盲篇 1.What is Qt 一个跨平台应用程序和UI开发框架,主要偏向于UI框架方面,由诺基亚公司开发维护. 使用 Qt 只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操 ...

随机推荐

  1. Node学习思维导图

    如果看不清楚图片上的内容,右键保存图片或新窗口打开.

  2. 在update语句中使用子查询

    在update 中的 where 子句中使用子查询: UPDATE mg_page_log as a  SET  page_num=1 WHERE id in( SELECT id  from mg_ ...

  3. Jenkins 集成打包和上传 App Store 的冲突

    周一下午用 Jenkins 集成打包,遇到了一个很奇怪的问题,之前上传到 APP Store 的时候 Build Settings->“Code Signing Resource Rules P ...

  4. 【Beta】Daily Scrum Meeting第七次

    1.任务进度 学号 已完成 接下去要做 502 发布任务到服务器 测试 509 将各api的处理逻辑放到类里面 让主api调用这些类 517 删除任务和教师的控件及逻辑 提交报课审核信息 530 完善 ...

  5. NFSv4的引用,迁移和备份(用户手册 v0.2)

    RFC3530 定义了NFS文件系统迁移和引用的管理机制.文件系统定位功能通过fs_location属性向客户端提供文件系统的位置信息.fs_location属 性是一个包含有位置信息的列表,位置信息 ...

  6. Android进程间通讯

    最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...

  7. 分析错误:socket accept failed too many open files

    步骤:1.--查看当前各个进程打开的文件句柄数,其结果的第一列表示句柄数,第二列表示进程号lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more 2. ...

  8. Excel数据导入数据库的SQL快速生成

    =CONCATENATE("insert into table_name(id, code, name, remark) values (uuid(),'",B2,"', ...

  9. ASP.NET TextBox 当鼠标点击后清空默认提示文字

    ASP.NET TextBox 当鼠标点击后清空默认提示文字 [ 方法一] 前台代码: <div>    <asp:TextBox ID="txtName" ru ...

  10. Async IO

    I was recently reading a series on “Write Sequential Non-Blocking IO Code With Fibers in NodeJS” by  ...