• GCD详细用法


    一、延迟执行
    1.介绍
    第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。

    [self performSelector:@selector(run) withObject:nil afterDelay:3.0];

    说明:在3秒钟之后,执行run函数

     

    第二种方法,什么时间,执行这个队列中的这个任务。如果队列是主队列,那么就在主线程执行,如果队列是并发队列,那么会新开启一个线程,

                         在子线程中执行。

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

           //延迟执行的方法

        });

    说明:在5秒钟之后,执行block中的代码段。

    参数说明:

     

    二、一次性代码

    1、使用dispatch_once创建一次性代码,整个程序运行过程中,只会执行一次

         使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次

         static dispatch_once_t onceToken;

         dispatch_once(&onceToken, ^{

             // 只执行1次的代码(这里面默认是线程安全的)

         });

      

    三、基本用法

    1、主队列(串行队列):是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。

          提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。

    获取主队列的方式:

     dispatch_queue_t queue=dispatch_get_main_queue();

    (1)使用异步函数执行主队列中得任务:

         dispatch_async(queue, ^{

               NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);

           }); 

    (2)使用同步函数,在主线程中执行主队列中得任务,会发生死循环,任务无法往下执行。所以禁止在主线程中执行同步函数,示意图如下:

     

      

    2、全局队列(并发队列)  GCD在每个应用程序都一个全局队列,所以不需要创建并发队列,可以直接使用

          提示:同步函数不会新建线程,异步执行可能会新建N条线程
     

    获取一个全局串行队列 

         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 30//2.把任务添加到队列中执行31
    (1) 异步执行
            dispatch_async(queue, ^{
           异步执行的代  });
     
    (2)同步执行
              dispatch_sync(queue, ^{
           NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
     
    2、新建队列(串行队列)
          提示:同步函数不会新建线程,异步执行会新建1条线程,需要执行的异步代码放在新建的子线程,但是任然会串行执行
     
     

    新建串行队列

          dispatch_queue_t queue = dispatch_queue_create("zhufeidong", NULL); // 创建串行队列

          dispatch_release(queue);             // 非ARC需要释放手动创建的队列

    (1) 异步执行
            dispatch_async(queue, ^{
           异步执行的代  });
     
    (2)同步执行
              dispatch_sync(queue, ^{
           NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);    });
     
    2、队列组

    步骤:

    (1)创建一个组:dispatch_group_t group =  dispatch_group_create();

    (2)任务1:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                                    // 执行1个耗时的异步操作

                             });

    (3)任务2:dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                                                     // 执行1个耗时的异步操作

                            });

    (4)执行完毕之后:dispatch_group_notify(group, dispatch_get_main_queue(), ^{

                                                   // 等前面的异步操作都执行完毕后,回到主线程...

                             });

     
  • 相关阅读:
    mongodb的安装和sql操作
    查看apache和nginx的负载和连接数情况
    ansible中playbook使用
    mysql导入导出命令详解
    生产环境下yum的配置
    firewalld的防火墙
    SOCK5代理服务器
    Linux系统基础优化总结
    服务器内存和缓存的优化
    activemq概念介绍
  • 原文地址:https://www.cnblogs.com/hepingqingfeng/p/5457682.html
Copyright © 2020-2023  润新知