gcd

获取队列

支持两种队列,一种是串行队列,系统的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
2
3
dispatch_sync(queue, ^{  
code;
});

运行同步任务要特别注意死锁的情况,下面这个情况已经死锁。

1
2
3
4
5
dispatch_sync(queue, ^{  
dispatch_sync(queue, ^{
code;
});
});

###2.运行异步任务

1
2
3
dispatch_async(queue, ^{  
code;
});

###3.运行延时任务

1
2
3
4
5
double delayInSeconds = 1.0;  
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(time, queue, ^(void){
code;
});

###4.运行不与队列中其他任务并行地任务

1
2
3
dispatch_barrier_async(queue, ^{  
code;
});

###5.运行只运行一次的任务

常用来创建单例。

1
2
3
4
static dispatch_once_t onceToken;  
dispatch_once(&onceToken, ^{
code;
});

##监控任务完成
利用Dispatch Groups对队列中的任务进行监控。

###1.创建组

1
dispatch_group_t group = dispatch_group_create();

###2.通知group任务开始和结束

1
2
3
dispatch_group_enter(group);  
do some work here;
dispatch_group_leave(group);

###3.监控组内的任务是否都完成

dispatch_group_wait会造成当前线程阻塞。

1
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

dispatch_group_notify不会阻塞当前线程

1
2
3
dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
code;
});