CGD相关知识

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一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容