Dispatch Queue
“开发者要做的只是定义想要执行的任务,并追加到适当的Dispatch Queque中”,用代码表述如下:
dispatch_async(queue, ^{
/*
* 想要执行的任务Code
*/
});
Dispatch Queue在上述代码 就是执行处理等待的队列,开发者可通过下面的代码创建想要执行的队列。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Dispatch Queque的分类
- Serial Dispatch queue:又叫private dispatch queues,同时只执行一个任务。一个Serial queue只占用一个线程,常用于同步访问特定的资源或数据。当你创建多个Serialqueue时,虽然各自是同步,但serial queue之间是并发执行。
- Concurrent Dispatch queue:又叫global dispatch queue,可以并发的执行多个任务,但执行完成顺序是随机的。系统提供四个全局并发队列,这四个队列有这对应的优先级,用户是不能够创建全局队列的,只能获取。
- Main Dispatch queue:全局可用的serial queue,在应用程序主线程上执行任务。
dispatch_queue_creat
通过dispatch_queue_creat函数来生产可执行的Dispatch Queue。
该函数有两个参数,第一个自定义的队列名,第二个参数是队列类型,默认NULL或者DISPATCH_QUEUE_SERIAL的是串行,参数为DISPATCH_QUEUE_CONCURRENT为并行队列。
dispatch_queue_t queueCon, queueSerial;
queueCon = dispatch_queue_create("com.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
queueSerial = dispatch_queue_create("com.serial.queue", DISPATCH_QUEUE_SERIAL);
队列优先级
可以通过dipatch_queue_attr_make_with_qos_class或dispatch_set_target_queue方法设置队列的优先级。
dipatch_queue_attr_make_with_qos_class
* Returns an attribute value which may be provided to dispatch_queue_create()
* or dispatch_queue_create_with_target(), in order to assign a QOS class and
* relative priority to the queue.
*
* @discussion
* When specified in this manner, the QOS class and relative priority take
* precedence over those inherited from the dispatch queue's target queue (if
* any) as long that does not result in a lower QOS class and relative priority.
*
* The global queue priorities map to the following QOS classes:
* - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
* - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
* - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
* - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
*
* Example:
* <code>
* dispatch_queue_t queue;
* dispatch_queue_attr_t attr;
* attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL,
* QOS_CLASS_UTILITY, 0);
* queue = dispatch_queue_create("com.example.myqueue", attr);
* </code>
* @param attr
* A queue attribute value to be combined with the QOS class, or NULL.
*
* @param qos_class
* A QOS class value:
* - QOS_CLASS_USER_INTERACTIVE
* - QOS_CLASS_USER_INITIATED
* - QOS_CLASS_DEFAULT
* - QOS_CLASS_UTILITY
* - QOS_CLASS_BACKGROUND
* Passing any other value results in NULL being returned.
*
* @param relative_priority
* A relative priority within the QOS class. This value is a negative
* offset from the maximum supported scheduler priority for the given class.
* Passing a value greater than zero or less than QOS_MIN_RELATIVE_PRIORITY
* results in NULL being returned.
*
* @return
* Returns an attribute value which may be provided to dispatch_queue_create()
* and dispatch_queue_create_with_target(), or NULL if an invalid QOS class was
* requested.
* The new value combines the attributes specified by the 'attr' parameter and
* the new QOS class and relative priority.
*/
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.qosqueue", attr);
dispatch_set_target_queue
可以设置优先级,也可以设置队列层级体系,比如让多个串行和并行队列在统一一个串行队列里串行执行。
//dispatch_set_target_queue
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.settargetqueue",NULL); //需要设置优先级的queue
dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //参考优先级
//设置queue和referQueue的优先级一样
dispatch_set_target_queue(queue, referQueue);
//让多个串行和并行队列在统一一个串行队列里串行执行
dispatch_queue_t serialQueue = dispatch_queue_create("com.starming.gcddemo.serialqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t firstQueue = dispatch_queue_create("com.starming.gcddemo.firstqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t secondQueue = dispatch_queue_create("com.starming.gcddemo.secondqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(firstQueue, serialQueue);
dispatch_set_target_queue(secondQueue, serialQueue);
dispatch_async(firstQueue, ^{
NSLog(@"1"