iOS dispatch_queue_t 和dispatch_group_t

269 阅读2分钟

前言:回顾下一直在使用的GCD中的一些概念.

dispatch_queue_t 队列

队列:顾名思义,就是排队,什么排队?当然是要执行的任务进行排队.这个队列要通过一个桥,是一列通过还是多列同时通过呢?这就队列中任务的执行方式.串行还是并行.

  • 创建一个串行队列
dispatch_queue_t quene = dispatch_queue_create(@"queue1", DISPATCH_QUEUE_SERIAL);
  • 创建一个并行队列
dispatch_queue_t quene = dispatch_queue_create(@"queue1", DISPATCH_QUEUE_CONCURRENT);

并行队列中有一个全局并行队列:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

该队列的参数:第一个是优先级,第二个待定.如果不想自己创建队列,直接使用这个就可以,这个是系统默认创建的一个全局并发队列.

其中 queue1 是这个队列的名字,也是唯一标识.DISPATCH_QUEUE_SERIAL(串行)和DISPATCH_QUEUE_CONCURRENT(并行)是队列的执行的方式,

队列 怎么用?

//串行队列
 dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
//加入俩个异步操作 
dispatch_async(queue, ^{
        for(int i=0;i<5;i++ ){
            NSLog(@" 1当前线程  %@",[NSThread currentThread]);
        }
    });
dispatch_async(queue, ^{
        for(int i=0;i<5;i++ ){
            NSLog(@" 2当前线程  %@",[NSThread currentThread]);
        }
    });

输出结果:第一个for循环结束,进行第二个.

//并行队列
 dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
//加入俩个异步操作 
dispatch_async(queue, ^{
        for(int i=0;i<5;i++ ){
            NSLog(@" 1当前线程  %@",[NSThread currentThread]);
        }
    });
dispatch_async(queue, ^{
        for(int i=0;i<5;i++ ){
            NSLog(@" 2当前线程  %@",[NSThread currentThread]);
        }
    });

输出结果:这个就无序输出了.

注意!!!!!!! 下面的 会 死锁 死锁 死锁

    dispatch_sync(dispatch_get_main_queue(), ^{
        
    })

说完 dispatch_queue_t 队列 接下来我们说下 dispatch_group_t

dispatch_group_t

首先创建一个 组:

dispatch_group_t  group = dispatch_group_create();

组就是用来装队列用的,一般的使用场景线程间的通讯.就是多个异步操作之间的依赖关系.组内每一个队列执行完成之后,会发送一个通知:

dispatch_group_notify

得到这个通知 你可以 回调到主线程更新UI 也阔以 进行接下来的其他操作. queue 可以是多个 queue1 queue2 queue3 也阔以是一个 不影响结果

 dispatch_group_t  group = dispatch_group_create();
    dispatch_queue_t  queue = dispatch_queue_create(NULL,  DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, queue, ^{
        for(int i=0;i<10;i++ ){
            NSLog(@" 0当前线程  %@",[NSThread currentThread]);
        }
    });
    dispatch_group_async(group, queue, ^{
        for(int i=0;i<10;i++ ){
            NSLog(@" 1当前线程  %@",[NSThread currentThread]);
        }
    });
    dispatch_group_async(group, queue, ^{
        for(int i=0;i<10;i++ ){
            NSLog(@" 2当前线程  %@",[NSThread currentThread]);
        }
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"完成");
    });

在所有线程执行完成之后会得到 完成的通知.