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. JS错误记录 - 右侧悬浮框 - 缓冲运动

    本次练习错误总结: 1.  正确: startMove( document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop); ...

  2. Spring模块作用

    0.模块整理 Spring模块整理(http://www.kuqin.com/shuoit/20150805/347434.html) 模块名 作用 资料 aop  spring的面向切面编程,提供A ...

  3. C++遍历目录+_finddata_t结构体用法

    Struct _finddata_t是用来存储文件各种信息的结构体,使用这个结构体要引用的头文件为“ #include <io.h>”它的结构体定义如下: struct _finddata ...

  4. 00081_List接口

    1.List接口介绍 (1)有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元 ...

  5. Linux搭建aspx.net环境之:CentOs 7 安装 Mono 和 Jexus 步骤记录

    1 因为163没有CentOs7的镜像.所以没有加这个 wget  http://mirrors.163.com/.help/CentOS6-Base-163.repo cd /etc/yum.rep ...

  6. ZOJ 3587 Marlon&#39;s String 扩展KMP

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3587 题意:给出两个字符串S和T.S,T<=100000.拿出 ...

  7. UVA - 10167 - Birthday Cake (简单枚举)

    思路:简单枚举 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include &l ...

  8. jquery的图片轮播 模板类型

    先说一下用到的几个重要的事件 j jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(event,childSelector,data,function,map) ...

  9. win7-时间更新

    今天发现电脑的时间不对,后来就自己摸索了时间的自动更新方法.自己记录下来,以方便以后忘了查询 点击电脑右下角的时间->选择更改日期和时间设置->选择internet->更改设置-&g ...

  10. ELKstack 中文指南

    https://www.elastic.co/downloads ELKstack 中文指南 .net Elasticsearch 学习入门笔记   一. es安装相关1.elasticsearch安 ...