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, ); 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, ); //开启一个任务,放到队列组中,异步执行
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]);
}); }