概述

GCD是苹果公司为多核的并行运算提出的解决方案。全称是Grand Central Dospatch。纯C语言,提供了非常多强大的函数。

GCD自动管理线程的声明周期(创建线程、调度任务、销毁线程)。面向开发者只需要告诉GCD执行的任务。

GCD的核心概念

  • 任务-执行的操作
  • 队列-存放任务

GCD将任务添加进队列中,GCD会自动将队列中的任务取出放到对应的线程执行。任务的取出遵循队列的FIFO原则。

GCD基本使用

在使用GCD首先得创建队列。队列是用来添加任务的。GCD队列主要分两种类型:串行队列并发队列。队列类型决定队列中任务执行方式。

如果是串行队列,队列中的任务执行时按顺序的执行。先添加进去的任务执行完毕,后面的任务再被取出放进对应的线程执行。

如果是并发队列,队列中的任务执行可以支持同时将队列中的多个任务同时放在不同线程并发执行。

// label 队列的名字
// 队列的类型 DISPATCH_QUEUE_CONCURRENT并发 DISPATCH_QUEUE_SERIAL串行
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL);

当任务添加进队列就需要执行了。GCD提供了两个函数执行队列中的任务。dispatch_asyncdispatch_sync。这两个函数只决定有没有开线程的能力。

  • dispatch_async具备开启新的线程执行任务。
  • dispatch_sync不具备开启新的线程,只能在当前线程执行任务。

总结:

* dispatch_async + 并发队列: 开启多条线程并发执行任务

* dispatch_async + 串行队列: 开启一条线程串行发执行任务

// 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL); // 将任务添加三个队列
dispatch_async(queue, ^{
// 添加任务1
NSLog(@"----------------------1%@", [NSThread currentThread]);
NSLog(@"----------------------1%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务2
NSLog(@"----------------------2%@", [NSThread currentThread]);
NSLog(@"----------------------2%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务3
NSLog(@"----------------------3%@", [NSThread currentThread]);
NSLog(@"----------------------3%@", [NSThread currentThread]);
});

上面代码中我们往串行队列中添加了三个任务,使用了GCD异步函数执行,具备开线程的能力。系统此时会开启一条子线程按顺序将三个任务放进子线程中执行.

同理如果我们将队列改为并发队列。系统会开启多条线程分别将三个任务放入不同线程同时执行。开启的线程条数有系统决定。

上面通过GCD将我们的任务放在子线程中执行。队列使我们自己创建的,其实系统提供了全局的队列供我们使用。dispatch_get_main_queue和dispatch_get_global_queue

/**
* identifier 队列的有先级 通常传递default
* flags 一般传0
*/
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

iOS开发系列-GCD的更多相关文章

  1. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  2. iOS开发系列

    因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...

  3. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  4. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  5. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  6. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  7. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  8. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  9. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

随机推荐

  1. Oozie安装

    Oozie的安装与部署 1.解压Oozie $ tar -zxf /opt/softwares/oozie-4.0.0-cdh5.3.6.tar.gz -C /opt/modules/cdh/ 2.H ...

  2. BZOJ 2225: [Spoj 2371]Another Longest Increasing (CDQ分治+dp)

    题面 Description 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output ...

  3. NX二次开发-UFUN拉伸函数UF_MODL_create_extruded2

    NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...

  4. NX二次开发-算法篇-判断找到两个数组里不相同的对象

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  5. (转)Linux负载均衡软件LVS之一(概念篇)

    转:http://ixdba.blog.51cto.com/2895551/552947 Linux负载均衡软件LVS之二(安装篇):http://ixdba.blog.51cto.com/28955 ...

  6. hdu多校第九场 1002 (hdu6681) Rikka with Cake 树状数组维护区间和/离散化

    题意: 在一块长方形蛋糕上切若干刀,每一刀都是从长方形某条边开始,垂直于这条边,但不切到对边,求把长方形切成了多少块. 题解: 块数=交点数+1 因为对于每个交点,唯一且不重复地对应着一块蛋糕. 就是 ...

  7. Spring-Security (学习记录六)--采用ehcache缓存UserDetails

    目录 1. spring-security提供了缓存UserDetails的UserDetailsService实现类. 2. 通过配置来完成缓存 UserDetails (使用ehcache) 3. ...

  8. $nextTick与nextTick

    $nextTick Data-Dom-之后回调 nextTick Data-回调-Dom

  9. ZK4字命令

    zookeeper4字命令:两种方式,1.通过telnet链接服务器,执行stat.2.echo stat|nc xxx.xxx.xxx.xxx 2181效果是一样的conf:zk服务器运行时的基本信 ...

  10. hive简述

    显示表头,当前终端有效 set hive.cli.print.header=true; 查看表结构 desc table; 详细的表结构 desc formatted table; 删除表 drop ...