iOS---GCD的三种常见用法

1.一次性代码:dispatch_once

有时候,有些代码在程序中只要被执行一次。

整个程序运行过程中,只会执行一次。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    static dispatch_once_t onceToken ;
    dispatch_once(&onceToken, ^{
        NSLog(@"代码只执行一次");
    });
}

 2.延时执行

  延时执行通常有两种方法:

  (1)普通用法

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

 (2)GCD用法

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //两秒后执行的代码
        NSLog(@"ahah");
    });

如果队列是主队列,就在主队列中执行。如果队列是并发队列,就会开启新的线程。

    //全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
        //两秒后执行的代码
        NSLog(@"ahah");
    });

2017-06-17 10:32:09.483 GCDTest[15536:2440067] 代码只执行一次

2017-06-17 10:32:11.683 GCDTest[15536:2440162] ahah --- <NSThread: 0x608000063300>{number = 3, name = (null)}

3.队列组

创建一个队列组—>

开启多个任务(将所有任务放到队列组里面,同时执行)—>

等队列组里面的所有任务都执行完成,再回到主线程执行其他操作

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //1.创建一个队列组
    dispatch_group_t group = dispatch_group_create();
    
    //全局并发队列
    dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //开启一个任务,放到队列组中,异步执行
    dispatch_group_async(group, global_queue, ^{
        
        NSLog(@"小红吃饭------%@",[NSThread currentThread]);
        
    });
    
    //再开启一个任务
    dispatch_group_async(group, global_queue, ^{
        NSLog(@"小明吃饭------%@",[NSThread currentThread]);
    });
    
    //两个任务执行完,再执行这个
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"吃完一起回家------%@",[NSThread currentThread]);
    });
    
}
原文地址:https://www.cnblogs.com/huadeng/p/7039627.html