对于GCD来说,所有的执行都放到队列中(queue),队列的特点是FIFO(先提交的先执行)。从“数据结构”的角度看,队列和栈一样都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。这里多提一下,栈和队列对插入和删除操作的“限定”有所不同, 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表t。
GCD的队列分为几种,主队列(main),全局队列(global),用户创建队列(create)。
对于全局队列,默认有四个,分为以下四个优先级:
DISPATCH_QUEUE_PRIORITY_HIGH:2优先级最高,在default,和low之前执行
DISPATCH_QUEUE_PRIORITY_DEFAULT:0 默认优先级,在low之前,在high之后
DISPATCH_QUEUE_PRIORITY_LOW:-2 在high和default后执行
DISPATCH_QUEUE_PRIORITY_BACKGROUND:INT16_MIN 提交到这个队列的任务会在high优先级的任务和已经提交到background队列的执行完后执行。官方文档:(the queue is scheduled for execution after all high priority queues have been scheduled and the system runs items on a thread whose priority is set for background status.)
几个需要说明的概念:
异步提交的任务立刻返回,在后台队列中执行;
同步提交的任务在执行完成后才会返回;
并行执行(全局队列)提交到一个队列的任务,比如提交了任务1和任务2,在任务1开始执行,并且没有执行完毕时候,任务2就可以开始执行;
串行执行(用户创建队列) 提交到一个队列中的任务,比如提交了任务1和任务2,只有任务1结束后,任务2才可执行。
注意:提交到队列中的任务是串行执行,还是并行执行由队列本身决定。
dispatch_async/dispatch_sync
功能:提交到队列中异步/同步执行。
dispatch_get_global_queue(long identifier, unsigned long flags),这个函数的第一个参数是队列的优先级,第二个参数尚没有意义,直接写0就可以了。