获取队列
支持两种队列,一种是串行队列,系统的main队列就是一个串行队列,所有的UI操作都在这个队列当中;另一种是并发队列,队列中的任务按照添加顺序运行,运行结束的时间不确定。
###1.获取主队列
所有的UI操作都必须放到主队列中。
1 | dispatch_queue_t queue = dispatch_get_main_queue(); |
###2.获取全局队列
全局队列有四种优先级DISPATCH_QUEUE_PRIORITY_HIGH
,DISPATCH_QUEUE_PRIORITY_LOW
,DISPATCH_QUEUE_PRIORITY_DEFAULT
,DISPATCH_QUEUE_PRIORITY_BACKGROUND
。
1 | dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); |
###3.创建自定义队列
第一个参数时队列的名字,第二个参数是队列的类型。
1 | dispatch_queue_t queue = dispath_queue_create("queue", DISPATCH_QUEUE_CONCURRENT); |
运行任务
###1.运行同步任务
1 | dispatch_sync(queue, ^{ |
运行同步任务要特别注意死锁的情况,下面这个情况已经死锁。
1 | dispatch_sync(queue, ^{ |
###2.运行异步任务
1 | dispatch_async(queue, ^{ |
###3.运行延时任务
1 | double delayInSeconds = 1.0; |
###4.运行不与队列中其他任务并行地任务
1 | dispatch_barrier_async(queue, ^{ |
###5.运行只运行一次的任务
常用来创建单例。
1 | static dispatch_once_t onceToken; |
##监控任务完成
利用Dispatch Groups对队列中的任务进行监控。
###1.创建组
1 | dispatch_group_t group = dispatch_group_create(); |
###2.通知group任务开始和结束
1 | dispatch_group_enter(group); |
###3.监控组内的任务是否都完成
dispatch_group_wait
会造成当前线程阻塞。
1 | dispatch_group_wait(group, DISPATCH_TIME_FOREVER); |
dispatch_group_notify
不会阻塞当前线程
1 | dispatch_group_notify(group, dispatch_get_main_queue(), ^{ |