博客
关于我
iOS 多线程GCD简介
阅读量:424 次
发布时间:2019-03-06

本文共 2901 字,大约阅读时间需要 9 分钟。

一、简介

  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, 0);        // 2.将任务加入队列    dispatch_async(queue, ^{        for (NSInteger i = 0; i<10; i++) {            NSLog(@"one-----%@", [NSThread currentThread]);        }    });    dispatch_async(queue, ^{        for (NSInteger i = 0; i<10; i++) {            NSLog(@"two-----%@", [NSThread currentThread]);        }    });        dispatch_async(queue, ^{        for (NSInteger i = 0; i<10; i++) {            NSLog(@"three-----%@", [NSThread currentThread]);        }    });        NSLog(@"asyncConcurrent--------end");}

 

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

           

 

转载地址:http://erfyz.baihongyu.com/

你可能感兴趣的文章
PAT 1008. Elevator (20)
查看>>
zzuli 1815: easy problem 打表
查看>>
天梯赛 L2-020. 功夫传人 BFS
查看>>
蓝桥杯 密码脱落 LCS
查看>>
第七届C/C++B-方格填数 DFS
查看>>
算法训练 区间K大数
查看>>
玲珑学院-ACM比赛1014 - Absolute Defeat
查看>>
POJ1006-Biorhythms
查看>>
数据结构课设--3哈夫曼编码译码系统(树应用)
查看>>
如何利用panel在一个窗口中实现诸多页面的显示
查看>>
51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
查看>>
pku 1061 青蛙的约会 扩展欧几里得
查看>>
Spring Boot 2.4 配置文件将加载机制大变化
查看>>
WPF之全局快捷键
查看>>
javascript 用函数语句和表达式定义函数的区别
查看>>
基于react hooks,antd4 配置生成表单并自动排列
查看>>
也来玩玩 javascript对象深拷贝,浅拷贝
查看>>
【转载】Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave
查看>>
Kubernetes实战总结 - 动态存储管理StorageClass
查看>>
Django实战总结 - 快速开发一个Web服务
查看>>