GCD队列总体分为同步队列和异步队列两种,添加到同步队列中的任务,根据添加的顺序挨个执行,添加到异步队列里面的任务,无序并发执行。
同步队列
获取同步队列的方式有两种,一种是通过dispatch_get_main_queue
函数,获取到系统创建的主队列,另外一种方式是自己通过dispatch_queue_create
函数创建同步队列。
//主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//同步队列
dispatch_queue_t serialQueue = dispatch_queue_create("com.zzfsuiye.serial",DISPATCH_QUEUE_CONCURRENT)
从代码中可以看到dispatch_queue_create
函数需要两个参数,第一个参数是队列的标签,一般使用倒置的域名写法,第二个参数是指定创建的队列的类型,DISPATCH_QUEUE_CONCURRENT
指我们创建同步队列,异步队列也可以通过该方法创建,只需要将第二个参数调整为DISPATCH_QUEUE_CONCURRENT
即可。
队列标签是队列的唯一标识,所以不同的队列标签值不要相同。我们可以通过函数dispatch_queue_get_label
获取指定队列的标签。
//获取队列标签,在这里我们得到com.zzfsuiye.serial
char *serialLabel = dispatch_queue_get_label(mainQueue)
对于dispatch_queue_get_label
函数有个特殊的参数DISPATCH_CURRENT_QUEUE_LABEL
,我们可以通过它获取到当前执行任务所在队列的标签。
char *currentLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)
异步队列
和同步队列相同,异步队列的获取方式同样有两种,一种是通过dispatch_get_global_queue获取系统创建的全局异步队列,另外一种方式是自己通过dispatch_queue_create
函数创建同步队列。
//全局异步队列
dispatch_queue_t globalQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//异步队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zzfsuiye.concurrent", DISPATCH_QUEUE_CONCURRENT);
首先我们来看dispatch_get_global_queue
函数,函数接收两个参数,第一个参数指定队列的优先级,第二个参数是预留字段,传0即可。
创建异步队列的函数我们在同步队列那里已经讲过,这里就不在介绍。不过我们在这里注意到全局队列是可以设置优先级的,我们自己创建队列的函数无法指定优先级。也就是自己创建的队列的优先级都是相等的。有没有办法可以更改自己创建的优先级呢,这时候就要用到dispatch_set_target_queue
函数。
dispatch_set_target_queue(concurrentQueue,globalQueue);
dispatch_set_target_queue
函数第一个参数concurrentQueue
是要更改优先级的队列,第二个参数globalQueue
是参考队列,也就是将队列concurrentQueue
的优先级设置成和队列globalQueue
一样。