Grand Central Dispatch(GCD)是异步执行任务的技术之一。开发者只需要定义想执行的任务并追加到适当的 Dispatch Queeu中,GCD就能生成必要的线程并计划执行任务。
GCD比以前的线程更有效率,因为它是作为系统的一部分来实现的。
dispatch_async(queue, ^{
/*
长时间处理的任务
*/
dispatch_async(dispatch_get_main_queue(), ^{
// 在主线程中执行的处理,例如更新用户界面
})
})
使用GCD,你只需要定义想执行的任务并追加到适当的Dispatch Queue中。
例如:
dispatch_async(queue, ^{
// 想执行的任务
})
什么是“Dispatch Queue”?是执行处理的等待队列。按照追加的顺序(FIFO,先进先出)执行处理。
Queue分为两种:
下面的图直观的展示了这两种队列的区别:
// 创建serial queue
dispatch_queue_t myQueue = dispatch_queue_create("com.sl.gcd.queue",NULL);
// 创建concurrent queue
dispatch_queu myConcurrentQueue = dispatch_queue_create("com.sl.gcd.concurrentqueue",DISPATCH_QUEUE_CONCURRENT);
// 创建的concurrent queue需要释放
dispatch_release(myConcurrentQueue);
// Main Dispatch Queue 主线程队列,由于主线程就一个,所以这个队列是serial队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// Global Dispatch Queue,该队列是concurrent队列
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue();
在指定的时长之后执行任务
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ULL * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
// 任务会在3秒后执行
})
dispatch_once是保证在app执行中只执行一次指定的处理。
例如:
static int ini = NO;
if(ini == NO) {
// 初始化
ini = YES;
}
这段代码在大部分情况下会很好地执行,但是在多核CPU下,会出问题。此时,就需要用dispatch_once来解决多线程情况下地代码问题。
static dispatch_once_t pred;
dispatch_once(&pred, ^{
// 初始化
});
如何在多有任务执行完成后,执行某个任务? 对于serial队列,只需要把任务放在所有任务之后即可。对于concurrent队列,情况比较复杂,需要用到dispatch_group。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ NSLog(@"1"); });
dispatch_group_async(group, queue, ^{ NSLog(@"2"); });
dispatch_group_async(group, queue, ^{ NSLog(@"3"); });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"done");});
dispatch_release(group);
dispatch_suspend(queue);
dispatch_resume(queue);
--EOF--