GCD 扫盲篇<转载>
2015-11-12 17:44
225 查看
GCD 扫盲篇
GCD有四个概念:串行队列、并行队列、同步、异步四者。如下简介:
这里不仅给出了不确定性,而且也给出了确定性。对于初学者而言,有时候因为那些不确定的东西所造成的疑问会像没有闸却在疾驰的汽车一样让人惊慌失措,而“确定性”就如同这救命的车闸一样,它能让你豁然开朗。
GCD提供了dispatch queues(调度队列)来执行代码段,这些队列以FIFO(先进先出)的方式来管理你用GCD提交的任务。这保证了你先提交的任务现执行,即第一个任务添加到队列中就第一个开始执行,第二个添加的任务将第二个执行,知道队列的最后一个任务。
--- | 同步 | 异步 |
---|---|---|
串行队列 | 不会新建线程,依然在当前线程上 类似同步锁,是同步锁的替代方案 ✅ 常用 | 会新建线程,只开一条线程 一条线程就够了 每次使用 createDispatch 方法就会新建一条线程,多次调用该方法,会创建多条线程,多条线程间会并行执行 |
并行队列 | 不会新建线程,依然在当前线程上 | 会新建线程,可以开多条线程 iOS7-SDK 时代一般是5、6条, iOS8-SDK 以后可以50、60条 ✅ 常用 |
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?
相关文章推荐
- ibatias学习笔记
- IIS中使用PUT方法錯誤記錄
- 佣金百万so easy!阿里云推广联盟喊你来赚钱
- oracle备份表
- mousewheel.js 和scroll api
- Ionic 插件创建
- 自行车生产规划问题
- Android串口操作
- 字符串匹配的Boyer-Moore算法
- tools:context="activity name"作用
- jQuery EasyUI Combotree 实现ComboBox的内容过滤
- 2种方法解决mysql主从不同步
- js获取当前域名
- pring mvc 批量上传+文件上传
- mysql 5.6 与5.7安装
- JavaBean-- DAO设计模式
- centos安装arcgisserver
- U方法传参数-ThinkPHP
- 韩顺平Linux笔记(十一)——crontab详解
- React with Webpack - 3: 内联image、font