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秒后加入队列去执行这里面的东西

    });

原文地址:https://www.cnblogs.com/liaolijun/p/7797514.html