GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好。

在cocoa-china上面有两篇关于GCD的文章。GCD 深入理解(一) GCD 深入理解(二)

CSDN荣芳志博客:点击打开链接

我仅仅是读了第一篇文章,在这对里面讲的几个操作函数做一下记录:

GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。

原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行;

串行队列-队列中的任务是串行的。执行完一个后接着执行下一个。可是队列与队列之间是并行的

并行队列-队列中的任务是并行的。所以结束的顺序不确定。

系统提供了四个全局并发队列
有不同的优先级background、low、default 以及 high

  1. #define DISPATCH_QUEUE_PRIORITY_HIGH 2
  2. #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
  3. #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
  4. #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

系统还提供给你一个叫做主队列的特殊队列。是一个串行队列,主要用与UI更新。

经常用法:

我们自己能够来创建队列

  1. <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操作;

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  2. // 运行比較耗时的操作
  3. dispatch_async(dispatch_get_main_queue(), ^{
  4. // 更新界面
  5. });
  6. });

  1. dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

用来获取一个全局队列,第一个參数是上面4个全局队列中的一个。第二个參数不知道是什么意思,默认填写0即可了。

上面将块中得 操作放入获取到的全局队列中去运行,运行完毕再获取主队列来更新ui;

dispatch_group_async

能够监听一组任务是否完毕,完毕后发送一个通知。

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //取得一个全局并发队列
  2. dispatch_group_t group = dispatch_group_create(); //创建一个运任务组
  3. dispatch_group_async(group, queue, ^{
  4. [NSThread sleepForTimeInterval:1]; //延迟一秒钟
  5. NSLog(@"group1");
  6. });
  1. //向组中加入任务
  1. dispatch_group_async(group, queue, ^{
  2. [NSThread sleepForTimeInterval:2]; //延迟两秒钟
  3. NSLog(@"group2");
  4. }); <pre name="code" class="objc" style="color: rgb(120, 73, 42); font-size: 11px;">//向组中加入任务

dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; //延迟三秒钟 NSLog(@"group3"); });

  1. //向组中加入任务

dispatch_group_notify(group,
dispatch_get_main_queue(), ^{ NSLog(@"updateUi"); }); //组中全部任务完毕后发出通知dispatch_release(group); 最后取消任务组

  1.  

dispatch_barrier_async

在一个队列中等到前面的任务结束后才运行,在运行此任务时保持串行(也就是运行完此任务的全部内容后其它恢复原队列的运行状态);

  1. dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_async(queue, ^{
  3. [NSThread sleepForTimeInterval:2];
  4. NSLog(@"dispatch_async1");
  5. });
  6. dispatch_async(queue, ^{
  7. [NSThread sleepForTimeInterval:4];
  8. NSLog(@"dispatch_async2");
  9. });  
  1. //以下是锁
  2. dispatch_barrier_async(queue, ^{
  3. NSLog(@"dispatch_barrier_async");
  4. [NSThread sleepForTimeInterval:4];
  5.  
  6. });
  7. dispatch_async(queue, ^{
  8. [NSThread sleepForTimeInterval:1];
  9. NSLog(@"dispatch_async3");
  10. });

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. CSU 8月月赛 Decimal 小数化分数

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1303 这个OJ很容易跪所以我贴一下题目 Description 任意一个分数都是有理数,对于任意一 ...

  2. linux系统下的/proc目录介绍

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  3. 迅雷云监工crysadm搭建

    之前在淘宝众筹买了个迅雷赚钱宝Pro,2016年01月到手,玩了半个月. 之后在看百度贴吧时,看到好多大神都在用PC上用网页版软件来管理赚钱宝.非常是好奇.搜索了非常多资料,基本上都已经过时了.都无法 ...

  4. Summary Day32

    1 . 文件管理 1.1 标C文件处理和UC文件处理函数的比較: 标C文件处理函数比UC的文件处理函数速度快.由于标C内部独立输入输出缓冲区, 会积累一定数量之后再写入文件,因此读写效率比較高 使用t ...

  5. [Python] List & Object spread in Python

    def myfunc(x, y, z): print(x, y, z) tuple_vec = (, , ) dict_vec = {, , } >>> myfunc(*tuple_ ...

  6. 关于结构体COORD介绍

    COORD是windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标.其定义为: typedef struct _COORD { SHORT X; // horizontal coor ...

  7. 你真的懂Flask中浅谈蓝图Blueprint吗?

    一,什么是Flask中的蓝图Blueprint Blueprint是用于实现Flask框架中单个应用的视图,模板,静态文件的集合. Blueprint 是一个存储操作(路由映射)方法的容器,这些操作在 ...

  8. 反序列化xml到treeview

    private void Form1_Load(object sender, EventArgs e) { string xmlPath = System.Environment.CurrentDir ...

  9. 词向量 word2vec

    看的这一篇的笔记 http://licstar.net/archives/328 看不太懂. 要学的话,看这里吧,这里把一些资料做了整合: http://www.cnblogs.com/wuzhitj ...

  10. Linux经常使用命令(七) - cp

    cp命令用来拷贝文件或者文件夹.是Linux系统中最经常使用的命令之中的一个.普通情况下.shell会设置一个别名.在命令行下拷贝文件时,假设目标文件已经存在.就会询问是否覆盖.无论你是否使用-i參数 ...