GCD 初步学习
GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好。
在cocoa-china上面有两篇关于GCD的文章。GCD 深入理解(一) GCD 深入理解(二)
CSDN荣芳志博客:点击打开链接
我仅仅是读了第一篇文章,在这对里面讲的几个操作函数做一下记录:
GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。
原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行;
串行队列-队列中的任务是串行的。执行完一个后接着执行下一个。可是队列与队列之间是并行的
并行队列-队列中的任务是并行的。所以结束的顺序不确定。
系统提供了四个全局并发队列
有不同的优先级background、low、default 以及 high
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
系统还提供给你一个叫做主队列的特殊队列。是一个串行队列,主要用与UI更新。
经常用法:
我们自己能够来创建队列
<span style="font-family:SimSun;font-size:12px;">dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);</span>
第一參数是队列的名字。第二个參数有两种DISPATCH_QUEUE_SERIAL。DISPATCH_QUEUE_CONCURRENT第一个是创建串行队列,第二个是创建并行队列。
dispatch_async
为了避免界面在处理时操作卡死,在还有一个线程中运行网络请求等操作,我们能够用dispatch_async来放入另外一个队列中。运行,主线程继续运行UI操作;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 运行比較耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
用来获取一个全局队列,第一个參数是上面4个全局队列中的一个。第二个參数不知道是什么意思,默认填写0即可了。
上面将块中得 操作放入获取到的全局队列中去运行,运行完毕再获取主队列来更新ui;
dispatch_group_async
能够监听一组任务是否完毕,完毕后发送一个通知。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //取得一个全局并发队列
dispatch_group_t group = dispatch_group_create(); //创建一个运任务组
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1]; //延迟一秒钟
NSLog(@"group1");
});
//向组中加入任务
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2]; //延迟两秒钟
NSLog(@"group2");
}); <pre name="code" class="objc" style="color: rgb(120, 73, 42); font-size: 11px;">//向组中加入任务
dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; //延迟三秒钟 NSLog(@"group3"); });
//向组中加入任务
dispatch_group_notify(group,
dispatch_get_main_queue(), ^{ NSLog(@"updateUi"); }); //组中全部任务完毕后发出通知dispatch_release(group); 最后取消任务组
dispatch_barrier_async
在一个队列中等到前面的任务结束后才运行,在运行此任务时保持串行(也就是运行完此任务的全部内容后其它恢复原队列的运行状态);
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async1");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"dispatch_async2");
});
//以下是锁
dispatch_barrier_async(queue, ^{
NSLog(@"dispatch_barrier_async");
[NSThread sleepForTimeInterval:4]; });
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async3");
});
GCD 初步学习的更多相关文章
- json2.js的初步学习与了解
json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...
- EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库
前提:搭建成功codefirst相关代码,参见EF Codefirst 初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...
- 初步学习python
自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...
- Git的初步学习
前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...
- 语法分析器初步学习——LISP语法分析
语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...
- 状态保持以及AJAX的初步学习
嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...
- LinQ的初步学习与总结
嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...
随机推荐
- django模型系统二
常用查询及表关系的实现 1.常用查询 每一个django模型类,都有一个默认的管理器 objects QuerySet表示数据库中对象的列表,它可以有0到多个过滤器.过滤器通过给定参数,缩小查询范围. ...
- 【Codeforces Round #456 (Div. 2) B】New Year's Eve
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然10000..取到之后 再取一个01111..就能异或成最大的数字了. [代码] /* 1.Shoud it use long ...
- 安卓View的缓冲机制
View组件显示的内容能够通过cache机制保存为bitmap, 主要有下面方法: void setDrawingCacheEnabled(boolean flag), Bitmap getDr ...
- battery-获取手机电量信息
我们如果想要获得手机的电池电量信息,可以借助广播来实现.因为当手机电池电量发生变化的时候,系统会发送一个广播.具体代码如下 //注册 intentFilter.addAction(Intent.ACT ...
- 【编程】概念的理解 —— socket
socket:A socket is something into which something is plugged or fitted (also called a receptacle). A ...
- 1.23 Python知识进阶 - 面向对象编程
一.编程方法 1.函数式编程:"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论.它属于"结构化 ...
- 【arc062e】Building Cubes with AtCoDeer
Description STL有n块瓷砖,编号从1到n,并且将这个编号写在瓷砖的正中央: 瓷砖的四个角上分别有四种颜色(可能相等可能不相等),并且用Ci,0,Ci,1,Ci,2,Ci,3分别表示左上. ...
- 洛谷 P1341 无序字母对(欧拉回路)
题目: 解题思路: 我好菜啊!! 首先可以n2搞定,而对于每个点,又可以在当前不优的状态下将不好的状态拼到后面. 最后回溯搞定. 代码: #include<cstdio> #include ...
- 【Codeforces Round #451 (Div. 2) B】Proper Nutrition
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 可以直接一层循环枚举. 也可以像我这样用一个数组来存y*b有哪些. 当然.感觉这样做写麻烦了.. [代码] /* 1.Shoud i ...
- 【hdu 1068】Girls and Boys
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=1068 [Description] 有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人 ...