/*************异步函数 + 并发队列:可以同时开启多条线程***************/
/*************同步函数 + 并发队列:不会开启新的线程***************/
/*************异步函数 + 串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务*************/
/*************同步函数 + 串行队列:不会开启新的线程,在当前线程执行任务,任务是串行的,执行完一个任务,再执行下一个任务***/
/******如何创建一个并发队列******/
1.普通方式创建
dispatch_queue_t queue = dispatch_queue_create("队列的名字", DISPATCH_QUEUE_CONCURRENT);
2.获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/******如何创建一个串行队列******/
1.普通方式创建
dispatch_queue_t queue = dispatch_queue_create("队列的名字", DISPATCH_QUEUE_SERIAL);
2.获得主队列(默认就是主线程)
dispatch_queue_t queue = dispatch_get_main_queue();
/******如何将队列加到同步函数******/
dispatch_sync(queue, ^{
NSLog(@"1-----%@", [NSThread currentThread]);
});
/******如何将队列加到异步函数******/
dispatch_async(queue, ^{
NSLog(@"1-----%@", [NSThread currentThread]);
});
/******异步函数回到主线程(线程间的通信)******/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
1.在子线程里执行任务(比如下载图片等耗时操作在此处执行)
2.子线程任务执行完毕回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
3.主线程做完事情又可以回到子线程
dispatch_async(queue, ^{
NSLog(@"1-----%@", [NSThread currentThread]);
});
});
});
/******延时函数的使用******/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"run-----");
});
/******保证某段代码在程序运行过程中只被执行一次(不能用于懒加载)******/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"------run");//默认线程是安全的
});
/******使用GCD实现快速迭代遍历******/
dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
//执行10次代码,index顺序不确定
});
/******barrier阻塞函数的使用(隔断队列的执行顺序,队列中这个函数前面的任务执行完,才会执行这个函数后面的任务)******/
注意点:这个函数不能使用全局队列,只能自己创建并发队列
dispatch_queue_t queue = dispatch_queue_create("wangliang", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
/******队列组的使用******/
1.创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.创建队列组
dispatch_group_t group = dispatch_group_create();
3.执行队列组任务
dispatch_group_async(group, queue, ^{
//任务一
});
dispatch_group_async(group, queue, ^{
//任务二
});
4.队列组中任务一任务二都完成了才会执行下面的内容
dispatch_group_notify(group, queue, ^{
//队列组中任务都完成了之后要做的操作放在此处
// 回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
//图片显示出来
self.imageView.image = image;
});
});