iOS多任务核心GCD-分派队列
GCD(Grand Central Dispatch)是iOS多任务的核心,广泛应用在iOS编程或者系统层面的各个方面。GCD是非常底层的框架,比操作队列更底层。GCD严格遵守先进先出(FIFO)结构,所以是无法在队列中使用优先级或者调整次序。
首先最重要的一点,分派队列是队列,而不是线程。队列是组织块的,调用dispatch_async不会让块执行,只是把块添加到队列中。GCD中队列是有层级的,事实上只有全局系统队列会被调度运行,访问方法是:dispatch_get_global_queue,以及下面优先级常量中的一个:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
这些队列都是并行的,GCD会根据可用线程尽可能按优先级调度队列。当我们创建队列时,队列会附加到某一个全局队列。默认情况下会附加到默认优先级队列上。当块到达头部时,实际上会移动目标队列的末尾。当到达全局队列的头部时就会执行。块被添加后,就会按照顺序运行,无法取消,也无法改变相对于队列中其他块的顺序。但是如果想让高优先级块插队呢?如下代码。创建两个队列,一个高优先级和一个低优先级,使高优先级队列是低优先级队列的目标队列:
dispatch_queue_t low = dispatch_queue_create("low",DISPATCH_QUEUE_SERIAL);
dispatch_queue_t high = dispatch_queue_create("high",DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(low,high);
通常是分派到低优先级队列:
dispatch_async(low,^{/ 低优先级块 /});
要分派到高优先级队列,暂停低优先级队列,并且在高优先级块结束后恢复低优先级队列:
dispatch_suspend(low);
dispatch_async(high,^{
/ 高优先级块 /
dispatch_resume(low);
});
暂停队列会组织调度开始就处于其中的任何块,还有人和以暂停队列为目标队列的队列。这样不会停止正在执行的块,但是就算低优先级块是CPU执行的下个目标,也不会被调度,直到resume。suspend和resume必需配对出现。