什么是GCD
          Grand Central Dispatch(强大的调度器),是一个C语言API;
          作用:多核并行运算的解决方案;

 GCD中有2个核心概念
     队列:用来存放任务
     任务:执行什么操作

工作原理:
          GCD会讲队列中的任务取出、放到相应的线程中;
          任务的取出遵循队列的FIFO原则:先进先出、后劲后出;
 

GCD的使用就2个步骤
     1、创建队列:
     2、定制任务,并添加到队列中:


GCD执行任务:
     两个执行任务的函数:
     1、同步(即按顺序执行)
          dispatch_sync(dispatch_queue_tqueue,
dispatch_block_tblock);
  • queue:队列
  • block:任务
      2、异步(并发执行任务)
     dispatch_async(dispatch_queue_tqueue,
dispatch_block_tblock);

  • 同步和异步的区别:
          同步:只在当前线程中执行任务、不具备开启新线程的能力;
          异步:可以在新的线程中执行任务、具备开始新线程的能力;

队列的类型
     两大类型:
     1、并发队列(Concurrent Dispatch Queue)
          可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
          但由于,同步执行函数不具备开启新线程的能力,所以无效;
     2、串行队列(Serial Dispatch Queue):
          让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务);
     
  • 有4个术语比较容易混淆:同步、异步、并发、串行
          同步、异步是针对GCD的执行函数而言;
                    二者区别:是否具有开始新线程的能力;
          并发、串行是针对GCD的队列而言;
                    二者的区别任务的执行方式

创建队列
    
     1、创建并发队列:
          (1)GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创创建
          使用dispatch_get_global_queue函数获得全局的并发队列;
     dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
//
获得全局并发队列
  • 全局并发队列的优先级
  • #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
    //
    后台
          (2)自己创建并发队列

dispatch_queue_t

dispatch_queue_create(const
char
*label, dispatch_queue_attr_t
attr);
       lable ://队列名称
       attire://队列的属性;

DISPATCH_QUEUE_CONCURRENT:并发队列

DISPATCH_QUEUE_SERIAL:串行队列;

         
2、创建串行队列:
          
    (1)、自己创建串行队列

dispatch_queue_t

dispatch_queue_create(const
char
*label, dispatch_queue_attr_t
attr);
       lable ://队列名称
       attire://队列的属性;
          DISPATCH_QUEUE_SERIAL:串行队列;
          DISPATCH_QUEUE_CONCURRENT:并发队列
  (2)、使用主队列(跟主线程相关联的队列 
          dispatch_queue_t queue =
dispatch_get_main_queue();

  • 主队列是GCD自带的一种特殊的串行队列
  • 放在主队列中的任务,都会放到主线程中执行

各种队列的执行效果



线程间通信示例
  • 从子线程回到主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{
             //
执行耗时的异步操作...
   
    dispatch_async(dispatch_get_main_queue(),
^{
               
// 回到主线程,执行UI刷新操作
          });
});


延时执行

iOS常见的延时执行有2种方式
     1、调用NSObject的方法
[self
performSelector:@selector(run)
withObject:nil
afterDelay:2.0];
     // 2秒后再调用self的run方法
     2、使用GCD函数
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(2.0
*
NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
   
// 2秒后执行这里的代码...在哪个线程执行,跟队列类型有
});

iOS - 多线程——GCD的更多相关文章

  1. iOS多线程 GCD

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

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

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

  3. iOS 多线程 GCD part3:API

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

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

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

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

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

  6. iOS多线程GCD的使用

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

  7. iOS多线程GCD详解

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

  8. iOS多线程GCD的简单使用

    在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispat ...

  9. iOS多线程——GCD篇

    什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObjec ...

  10. iOS 多线程GCD简介

    一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...

随机推荐

  1. spring boot+mybatis搭建项目

    一.创建spring boot项目 1.File->New->Project 2.选择 Spring Initializr ,然后选择默认的 url 点击[Next]: 3.修改项目信息 ...

  2. js实现图片幻灯片效果

    其效果是点击图片切换到下一张图片 首先准备五张图片 <ul class="imge"> <li><img src="images/1.jpg ...

  3. webstorm-在不删除硬盘文件的条件下移除项目

    一段时间没用之后会忘记如何在webstorm里移除一个项目,要花很长的时间去找到底如何才能移除,所以特地把它记录下来了,方便下次忘记的时候可以查阅 把鼠标移在你要移除的那个项目上然后按下Delete键 ...

  4. css概述五

    十一.显示 1.显示方式 决定元素在网页中的表现形式(块级,行内,行内块,table) 语法: display: 取值: 1.display:block: 让元素以块级的方式显示 2.display: ...

  5. java判断是否是合法IP

    public boolean ipCheck(String text) { if (text != null && !text.isEmpty()) { // 定义正则表达式 Stri ...

  6. Form action 方法上传文件

    <form method="post" id="form1" runat="server" enctype="multipa ...

  7. Oracle备份与恢复详解

    http://www.360doc.com/content/10/1015/15/3267996_61218717.shtml --------摘自 360doc 为了能有效地备份和恢复数据库,建议大 ...

  8. MySQL(7)— 索引

    七.索引 MySQL官方对索引的定义为:索引(Index)是帮助 MySQL 高效 获取数据的数据结构. 7-1.索引的分类 主键索引 (primary key) 唯一的标识,主键不可重复,只能有一个 ...

  9. [原创]RTX使用printf输出后进入hardfault中断的处理方法 - 讨论

    今天我用到RTX里面使用printf ,发现程序死掉了 我发现很多人遇到了这样的问题 找了网上很多的文章,说是这个是RTX的一个先天不足的问题 我发现了正点原子的 原子哥的解决方案,如下所示: --- ...

  10. SpringMVC入门总结

    一.SpringMVC的好处? 1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式 2,能与spring其它技术整合比如说webflow等, 3,获取request及s ...