多线程知识点之GCD的使用

/*************异步函数 + 并发队列:可以同时开启多条线程***************/

/*************同步函数 + 并发队列:不会开启新的线程***************/

/*************异步函数 + 串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务*************/

/*************同步函数 + 串行队列:不会开启新的线程,在当前线程执行任务,任务是串行的,执行完一个任务,再执行下一个任务***/

/******如何创建一个并发队列******/

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;

        });

});

原文地址:https://www.cnblogs.com/wangliang2015/p/5407743.html