本篇继续谈GCD,下一篇再写NSOperationQueue.
1.栅栏(zha lan)函数
//栅栏函数
dispatch_barrier_async(queue, ^{
NSLog(@"+++++++++++++++++++++++++++++");
});
作用:在异步并发队列中起到分割的作用。简单的说,就是让多个任务有先后顺序的执行。为什么是异步并发?因为同步函数并不会开线程,任务只会按顺序执行,只有在异步函数 并发队列中才会出现多个任务无序的执行,这时需要制定一定的顺序就可以利用GCD的栅栏函数。
基本使用:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//0.获得全局并发队列
//栅栏函数不能使用全局并发队列
//dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
//1.异步函数
dispatch_async(queue, ^{
NSLog(@"任务一");
});
dispatch_async(queue, ^{
NSLog(@"任务二");
});
//栅栏函数
dispatch_barrier_async(queue, ^{
NSLog(@"+++++++++++++栅 栏++++++++++++++++");
});
dispatch_async(queue, ^{
NSLog(@"任务三");
});
dispatch_async(queue, ^{
NSLog(@"任务四");
});
}
注意点:栅栏函数不能使用全局并发队列 为什么?因为苹果说的
2.队列组
队列组,就是把一个队列或多个队列放在一个组里,当组里的所有队列里的任务执行完以后,队列组可以监听到以便执行后续的任务。
基本使用:
//-1.获得队列组
dispatch_group_t group = dispatch_group_create();
//0.获得并发队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, queue,^{
// 队列中得 第一个任务
});
dispatch_group_async(group, queue,^{
// 队列中得 第二个任务
});
//主线程中执行
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 监听到队列组里的任务全部执行完成,然后在主线程中更新UI等操作,当然,这里的队列也可以使用上面的全局队列,根据需要选择
// });
});
3.补充,GCD封装任务以函数的形式