zoukankan      html  css  js  c++  java
  • GCD 实际项目运用场景

    /** dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 **/

     /** dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留字段备用(一般为0)。 **/

     /** dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面。 **/

    具体代码如下:

        NSLog(@"1");

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

            //这里操作耗时的任务 不管block是否运行结束,都不会阻塞UI线程

           // dispatch_async会向dispatch_get_global_queue全局队列去添加新的任务

            //网络请求

            //加载网络图片

            //数据解析

            NSLog(@"2");

            dispatch_async(dispatch_get_main_queue(), ^(){

                NSLog(@"4");

            });

        });

        NSLog(@"3");

    打印数据:

    2017-11-07 09:32:24.030493+0800 project[1479:30512] 1

    2017-11-07 09:32:24.030611+0800 project[1479:30512] 3

    2017-11-07 09:32:24.030622+0800 project[1479:30718] 2

    2017-11-07 09:32:24.033764+0800 project[1479:30512] 4

    二 任务组

    应用场景:在开发中,遇到N个网络请求都完成后更新UI的需求,这时使用dispatch_group_async

    有时候,我们希望多个任务同时(在多个线程里)执行,再他们都完成之后,再执行其他的任务,于是可以建立一个分组,让多个任务形成一个组,下面的代码在组中多个任务都执行完毕之后再执行后续的任务:
    运用场景:
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();

        /** 有时候,我们希望多个任务同时(在多个线程里)执行,再他们都完成之后,再执行其他的任务, **/

        /** 于是可以建立一个分组,让多个任务形成一个组,下面的代码在组中多个任务都执行完毕之后再执行后续的任务: **/

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        /** 创建一个group组 **/

        dispatch_group_t group = dispatch_group_create();

        /** 将block任务添加到queue队列,并被group组管理 **/

        dispatch_group_async(group, queue, ^{

           NSLog(@"request1");

        });

      dispatch_group_async(group, queue, ^{

        NSLog(@"request2");

        });

        dispatch_group_notify(group,dispatch_get_main_queue(),^{

        NSLog("updateUI");

       })

    添加进队列的任务延迟执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加到自己需要的队列中去执行

    //参数1 DISPATCH_TIME_NOW 表示 现在   NSEC_PER_SEC 秒   NSEC_PER_MSEC  毫秒  即是多长时间加入队列去执行block

    //参数2  (int64_t)(2 * NSEC_PER_SEC)  表示的是多长时间去执行

    //参数3 dispatch_get_main_queue() 想要加入哪个队列去执行  可以自定义

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    //2秒后加入队列去执行这里面的东西

        });

  • 相关阅读:
    基于Dubbo的压测调优实例
    R语言之Apriori算法应用
    Linux中的用户和组
    R语言中的循环及其扩展:iter和foreach
    R在Windows下连接Oracle数据库
    R语言之机器学习程序包(更新)
    R语言之数据结构
    windows环境下node安装教程(超详细)
    windows环境下elasticsearch安装教程(超详细)
    MongoDB分片介绍
  • 原文地址:https://www.cnblogs.com/liaolijun/p/7797514.html
Copyright © 2011-2022 走看看