zoukankan      html  css  js  c++  java
  • iOS 多线程GCD简介

    一、简介

      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、结果: (通过结果可以看出、有多条线程在执行、并且异步)

               

  • 相关阅读:
    关于表单的练习和基本登录界面的制作
    css3 闪光hover
    步步为营:Asp.Net序列化与反序列化
    步步为营:Asp.Net客户端存Cookie服务端取
    步步为营:Asp.Net使用HttpWebRequest通知,抓取,采集
    PHP学习(二):PHP的魔术方法
    步步为营:SQL通用存储过程分页
    PHP学习(三):PHP面向对象概念
    PHP学习(四):PHP5.3版本的新特性
    步步为营:Asp.Net转换Unix时间戳
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5585229.html
Copyright © 2011-2022 走看看