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 初步学习的更多相关文章

  1. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  2. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  3. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

  4. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

  5. 初步学习python

    自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...

  6. Git的初步学习

    前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...

  7. 语法分析器初步学习——LISP语法分析

    语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...

  8. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

  9. LinQ的初步学习与总结

    嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...

随机推荐

  1. AIX 5.3下创建逻辑卷、添加文件系统并挂载

    首先创建逻辑卷smit lv ,这里没多大问题就不细述了. 输入要创建的逻辑卷名.所属卷组.分配多少个LP.创建在哪块磁盘上等,另外还可以设置镜像,默认是只有一份镜像的,即不做mirror. 到此LV ...

  2. Vue 导出表格为Excel

    放法有多种,我这里是直接转JSON数据为Excel. 1.既然要使用,那首先当然是安装依赖,在终端命令输入: npm install -S file-saver xlsx npm install -D ...

  3. Activemq开启JMX及问题排查

    0.服务端开启JMX服务 一.修改${ ActiveMQ_HOME} /conf/activemq.xml文件 在<broker>标签中添加如下属性:useJMX="true&q ...

  4. 使用PHP中的curl发送请求

    使用CURL发送请求的基本流程 使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 初始化连接句柄: 设置CURL选项: 执行并获取结果: 释放VURL连接句柄. 下面的程序片段是 ...

  5. ubuntu mysql 无法启动 简单排查

    自己的站点非常久没有去上了,想打开发现竟然打不开了.所以就找了一系列的原因. vps不行了 dns解析出问题了 域名出问题了 简单排查之后,我的vps服务商用的是 ***(bandwagonhost) ...

  6. thinkphp5 left join

    thinkphp5 left join 一.总结 1.作用:left join就是即使不匹配也返回左表中的数据 2.join使用通式:object join ( mixed join [, mixed ...

  7. 免费的EmBitz可替代Keil MDK开发STM32、NXP项目

    一.背景 由于使用之前开发STM32是基于Keil MDK编译环境开发的,由于该软件是收费的,想用个免费开源的软件来替代Keil,EmBitz编译器是免费的,可以完全替代开发.下载程序支持J-Link ...

  8. C#调用C++生成的动态链接库DLL

    一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...

  9. 【MongoDB】The connection between two tables

    In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. ...

  10. Android 小米盒子游戏手柄按键捕获 - 能获取到的 home 键依旧是个痛

    Android 小米盒子游戏手柄按键捕获 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...