一、简介

  1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法。

    Grand 含义是“伟大的、宏大的”,Central含义“中央的”,Dispatch含义是“分发、派遣,调度”;

  1.2 GCD中有2个核心概念

    任务:执行什么操作

    队列:用来存放任务

二、使用步骤

  GCD的使用就2个步骤

  1、定制任务 (确定想做的事情)

  2、将任务添加到队列中 (GCD会自动将队列中的任务取出,放到对应的线程中执行)

   任务的取出遵循队列的FIFO原则:先进先出,后进后出

  3、执行任务

    GCD中有2个用来执行任务的常用函数

  3.1 用同步的方式执行任务

    dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); (queue:队列 block:任务)

   3.2 用异步的方式执行任务

       dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    3.3 GCD中还有个用来执行任务的函数:

      dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

      在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

   3.4 同步和异步的区别

      同步:只能在当前线程中执行任务,不具备开启新线程的能力

      异步:可以在新的线程中执行任务,具备开启新线程的能力

  4、队列

    GCD的队列可以分为2大类型

    4.1 并发队列(Concurrent Dispatch Queue)

      可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)

      并发功能只有在异步(dispatch_async)函数下才有效

    4.2串行队列(Serial Dispatch Queue)

      让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

    4.3 并发队列创建

      4.3.1 使用dispatch_queue_create函数创建队列

      dispatch_queue_t

      dispatch_queue_create(const char *label, // 队列名称

      dispatch_queue_attr_t attr); // 队列的类型

       创建并发队列

      dispatch_queue_t queue = dispatch_queue_create("cc.kyle.2016", DISPATCH_QUEUE_CONCURRENT);

        GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建

          使用dispatch_get_global_queue函数获得全局的并发队列

      dispatch_queue_t dispatch_get_global_queue(

      dispatch_queue_priority_t priority, // 队列的优先级

      unsigned long flags); // 此参数暂时无用,用0即可

      4.3.2获得全局并发队列

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

      4.3.3全局并发队列的优先级

      

   4.4串行队列的创建

      4.4.1 GCD中获得串行有2种途径

      使用dispatch_queue_create函数创建串行队列

      创建串行队列(队列类型传递NULL或者DISPATCH_QUEUE_SERIAL)

      dispatch_queue_t queue = dispatch_queue_create("com.Kyle.queue", NULL);

      使用主队列(跟主线程相关联的队列)

      主队列是GCD自带的一种特殊的串行队列

      放在主队列中的任务,都会放到主线程中执行

      使用dispatch_get_main_queue()获得主队列

      dispatch_queue_t queue = dispatch_get_main_queue();  

    5、各种队列的执行效果

    

三、一个实例 (异步+并发)

  1、异步+并发 (学习创建多线程的过程)

/**
* 异步函数 + 并发队列:可以同时开启多条线程
*/
- (void)asyncConcurrent
{
// 1.创建一个并发队列
// label : 相当于队列的名字
// dispatch_queue_t queue = dispatch_queue_create("com.kyle.gcd, DISPATCH_QUEUE_CONCURRENT); // 或者
  //1.获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); // 2.将任务加入队列
dispatch_async(queue, ^{
for (NSInteger i = ; i<; i++) {
NSLog(@"one-----%@", [NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = ; i<; i++) {
NSLog(@"two-----%@", [NSThread currentThread]);
}
}); dispatch_async(queue, ^{
for (NSInteger i = ; i<; i++) {
NSLog(@"three-----%@", [NSThread currentThread]);
}
}); NSLog(@"asyncConcurrent--------end");
}

  2、结果: (通过结果可以看出、有多条线程在执行、并且异步)

iOS 多线程GCD简介的更多相关文章

  1. iOS多线程GCD简介(一)

    之前讲过多线程之NSOperation,今天来讲讲代码更加简洁和高效的GCD.下面说的内容都是基于iOS6以后和ARC下. Grand Central Dispatch (GCD)简介 Grand C ...

  2. iOS多线程GCD简介(二)

    在上一篇中,我们主要讲了Dispatch Queue相关的内容.这篇主要讲一下一些和实际相关的使用实例,Dispatch Groups和Dispatch Semaphore. dispatch_aft ...

  3. iOS多线程 GCD

    iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ...

  4. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  5. iOS多线程——GCD与NSOperation总结

    很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...

  6. iOS多线程GCD的使用

    1. GCD 简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Di ...

  7. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  8. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  9. iOS多线程GCD详解

    在这之前,一直有个疑问就是:gcd的系统管理多线程的概念,如果你看到gcd管理多线程你肯定也有这样的疑问,就是:并发队列怎么回事,即是队列(先进先出)怎么会并发,本人郁闷了好久,才发现其实cgd管理多 ...

随机推荐

  1. VS代码提示不出现或者提示变成英文或者各种奇葩问题的解决

    万能法==>重置 代码提示变成英文的了 打开开发员命令提示 输入:devenv.exe /setup /resetuserdata /resetsettings 重新打开,会和你第一次安装完毕一 ...

  2. Qt on Android:创建可伸缩界面

    使用 Qt 来开发 Android 应用,也需要适配不同移动设备,适配多种多样的屏幕和分辨率.这次我们大概来讲一下如何使用 Qt 提供的机制来创建可伸缩的界面. DPI 必须要解释一下 DPI . D ...

  3. jar包依赖性查询

    项目中碰到jar包冲突,需要排除一些jar包时先要了解jar的依赖关系,maven提供了命令行来查询: mvn dependency:tree 返回依赖的属性结构

  4. xcode6 使用MJRefresh,Too many arguments to function call, expected 0, have *

    转载自:  http://blog.csdn.net/wsjshx/article/details/40743291 将XCode升级到6后,报Too many arguments to functi ...

  5. ManagementClass类解析和C#如何获取硬件的相关信息

    在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作. 现在先来介绍一下ManagementClass类,首先看一下类的继承 ...

  6. 用react的ReactCSSTransitionGroup插件实现简单的弹幕动画

    1,开始的思路 公司想做直播方面的项目,并想加入弹幕的功能,直播的页面已经作为一个组件放在了用react+redux写好的一个网站项目上.所以技术老大让我研究下如何用react实现弹幕的功能.下面我就 ...

  7. 【LeetCode】Verify Preorder Serialization of a Binary Tree(331)

    1. Description One way to serialize a binary tree is to use pre-order traversal. When we encounter a ...

  8. 弹幕文化与HTML5

    分享人:herry 弹幕篇:弹幕文化与HTML5 说说弹幕 弹幕文化 1什么是弹幕? 弹(dàn)幕(mù)在国内兴起已经有个把年了,相信很多朋友都差不多知道弹幕这个东西. 弹幕系统最初的起源是一家日 ...

  9. Xamarin.Android之布局文件智能提示问题

    一.前言 看到有人问关于xamarin.android的布局没智能提示问题(VS 2015),当然,写布局这东西没提示这是一件相对痛苦的事 ,所以这里就提供一个解决的方案! 二.解决方案 想要智能提示 ...

  10. JS基础之对象

    JS中一切皆为对象,这是一句常说的话.了解JS对象,从这句话开始吧.JS中的基本数据类型如number,bool,字符串,数组,null,undefined等等都是对象. 对象的本质: 带有属性和方法 ...