核心概念: 1任务--执行什么操作
2队列--用来存放任务
同步函数: dispatch_sync( dispatch_queue_t queue,dispatch_block_t block);
异步函数: dispatch_async( dispatch_queue_t queue,dispatch_block_t block);
并发队列: 只能在异步方式下才有效
串行队列: 让任务一个接一个执行
同步函数不能开启新线程,在当前线程中执行
异步函数可以开启新线程,在新线程中执行
并发队列多个任务同时执行
串行队列一个任务完成后再执行下个任务
创建一个串行队列: dispatch_queue_t queue=dispatch_queue_create("名字",null);
释放创建的队列: dispatch_release( queue );//MRC下需要释放
GCD默认提供了一个全局的并发队列,供整个程序使用,不需要手动创建
队列一://最高优先级的并发队列 ( 由第一个参数决定,下同 )
dispatch_queue_t queue1=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
队列二://默认优先级的队列
dispatch_queue_t queue2=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
队列三://低优先级的队列
dispatch_queue_t queue3=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
队列四://后台执行的队列
dispatch_queue_t queue4=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
主队列: 主队列中的任务都会放在主线程中执行,
获得主队列: dispatch_queue_t queue5=dispatch_get_main_queue();
异步函数下并发队列会开多条线程
异步函数下串行队列只会开一条线程
同步函数下都不会开线程
如果把任务放在主队列中执行,那么不论是同步还是异步都不会开新线程
static dispatch_once_t once;//这个可以实现一次性代码,整个程序运行中只执行一次
dispatch_once(&once, ^{
// 只执行一次的代码放在这
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"98989898");
});//三秒后在主线程执行打印