美文网首页iOS 学习笔记
GCD的使用(三)

GCD的使用(三)

作者: Misaki_yuyi | 来源:发表于2018-02-24 17:43 被阅读19次

  为什么我总能猜到奇奇怪怪的事,今天有点不淡定了,做好自己,自信,(๑•̀ㅂ•́)و✧加油。

七 队列的循环、挂起、恢复

  dispatch_apply()函数是用来循环执行队列中的任务的,使用方式是dispatch_apply(循环次数,任务所在队列 {要循环执行的任务})。在串行队列中,会在当前线程中执行。在并行队列的时候,会开辟新的线程,不过有可能会在当前线程中执行一些任务。不管是并行还是串行,dispatch_apply都会阻塞当前线程。

    NSLog(@"循环多次执行串行队列");
    dispatch_queue_t serialQueue = [self getSerialQueue:"串行"];
    dispatch_apply(2, serialQueue, ^(size_t index) {
        
        [self currentThreadSleep:index];
        NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
    });
    
    NSLog(@"循环多次执行并行队列");
    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    dispatch_apply(2, concurrentQueue, ^(size_t index) {
        
        [self currentThreadSleep:index];
        NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
    });

  输出的结果为


队列的循环 2018-02-24 下午5.27.46.png

  下面的代码就是讲队列挂起和唤醒。

    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    
    //将队列进行挂起
    dispatch_suspend(concurrentQueue);
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任务执行");
    });
    
    [self currentThreadSleep:2];
    
    //将挂起的队列唤醒
    dispatch_resume(concurrentQueue);

八 任务栅栏

  这个和任务组有点类似,将队列中的任务进行隔离,让任务能分拨的进行异步执行。从结果中可以看出,dispatch_barrier_async之前的任务会先异步执行,完成后执行栅栏中的任务块,当任务块执行完毕后,才会执行第二批任务。

    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    
    //第一批任务
    for (int i = 0 ; i < 3 ; i ++ )
    {
        dispatch_async(concurrentQueue, ^{
            [self currentThreadSleep:i];
            NSLog(@"第一批任务,%d,%@",i,[self getCurrentThread]);
        });
    }
    
    //添加栅栏
    dispatch_barrier_async(concurrentQueue, ^{
        NSLog(@"第一批执行完后才会执行第二批,%@",[self getCurrentThread]);
    });
    
    //第二批任务
    for (int i = 0 ; i < 3 ; i ++ )
    {
        dispatch_async(concurrentQueue, ^{
            [self currentThreadSleep:i];
            NSLog(@"第二批任务,%d,%@",i,[self getCurrentThread]);
        });
    }
任务栅栏 2018-02-24 下午5.30.18.png

  GCD定时器的应用在前面的iOS 实现红包雨中也提到了,GCD的用法也总结的差不多了,欢迎来查漏补缺。

相关文章

  • ##iOS开发之多线程开发之GCD

    三.GCD(经常使用) GCD(Grand Central Dispatch):牛逼的中枢调度器.GCD是基于C由...

  • swift 线程同步

    方法一 使用GCD和信号量 方法二 使用计数器的方式 方法三 使用GCD group的enter、leave、no...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • GCD的使用(三)

      为什么我总能猜到奇奇怪怪的事,今天有点不淡定了,做好自己,自信,(๑•̀ㅂ•́)و✧加油。 七 队列的循环、挂...

  • GCD详细总结

    一、什么是GCD 二、我们为什么要用GCD技术 三、在实际开发中如何使用GCD更好的实现我们的需求Synchron...

  • iOS多线程--彻底学会多线程之『GCD』

    GCD 文章目录 GCD简介 任务和队列 GCD的使用步骤 队列的创建方法 任务的创建方法 GCD的基本使用 并行...

  • iOS GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(六种组合不同区别,队列嵌套情况区别,相互...

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • iOS多线程--GCD篇

    GCD 文章目录GCD简介任务和队列GCD的使用步骤队列的创建方法任务的创建方法GCD的基本使用并行队列 + 同步...

  • iOS 关于GCD很详细的描述

    那为什么我们要使用 GCD 呢? 因为使用 GCD 有很多好处啊,具体如下:GCD 可用于多核的并行运算;GCD ...

网友评论

    本文标题:GCD的使用(三)

    本文链接:https://www.haomeiwen.com/subject/mnccxftx.html