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]); }); }