GCD-01(基本使用)

- (void)viewDidLoad {

    [super viewDidLoad];

    //GCD: Grand Central Dispatch 牛逼的中枢调度器

    //纯C语言, 提供了非常多强大的函数;自动管理线程的生命周期;苹果推荐

    //GCD中两个核心概念

    //1.任务:执行什么操作

    //2.队列:用来存放任务

    

    //GCD的使用步骤

    //1.定制任务--确定想做的事情

    //2.将任务添加到队列中--GCD会自动将队列中的任务取出,放到对应的线程中执行;--任务的取出遵循队列的FIFO原则:先进先出,后进后出

    

    //GCD中有两个用来执行任务的函数

    //1.用同步的方式执行任务,不具备开启新线程的能力

    //其中的参数为: queue : 队列; block:任务

    //dispatch_sync(dispatch_queue_t queue, <#^(void)block#>);

    //2.用异步的方式执行任务, 具备开启新线程的能力

    //dispatch_async(dispatch_queue_t queue, <#^(void)block#>);

    

    //同步和异步的区别,同步和异步决定了要不要开启新的线程

    //同步:在当前的线程中执行,不具备开启新线程;异步:在另一条线程中执行,具备开启新线程

    

    //并发和串行决定任务的执行方式,同时还是一个一个

    

    //GCD默认已经提供了全局的并发队列供整个应用的使用不需手动创建

    

    //GCD的队列可以分为2大类

    //1.并发队列,可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务),并发只有在异步函数才有效

    //2.串行队列,让任务一个接一个的执行

    

    //[self asyncGlobalQueue];

    

    //[self asyncSerialQueue];

    

    //[self syncGlobalQueue];

    

   // [self syncSerialQueue];

   //[self syncMainQueue];//会死掉

    

    [self asyncMainQueue];

}

#pragma mark - 异步

/**

 * 用dispatch_async异步函数往并发队列中添加任务

 */

- (void)asyncGlobalQueue {

    //1,获取全局的并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //2.添加任务到队列中执行任务

    dispatch_async(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"2---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"3---%@", [NSThread currentThread]);

    });

    //总结:同时开启3个线程

}

/**

 * 用dispatch_async异步函数往串行队列中添加任务

 */

- (void)asyncSerialQueue {

    //1.创建串行队列(GCD中获取串行的两种途径)1:

    dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);

    

   //2:使用主队列(跟主线程相关联的队列),主队列是GCD自带的一种特殊的串行队列,放在朱队列中的任务,都会放到主线程中执行

    

    //2.添加任务到队列中执行任务

    dispatch_async(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"2---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"3---%@", [NSThread currentThread]);

    });

    //总结:只开一个线程

    

    //3.如果在非ARC下需要释放资源

    //dispatch_release(queue);

}

#pragma mark - 同步

/**

 * 用dispatch_sync同步函数往并发队列中添加任务

 */

- (void)syncGlobalQueue {

    //1,获取全局的并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //2.添加任务到队列中执行任务

    dispatch_sync(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"2---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"3---%@", [NSThread currentThread]);

    });

    //总结:不会开启线程,并发队列失去并发功能

}

/**

 * 用dispatch_sync同步函数往串行队列中添加任务

 */

- (void)syncSerialQueue {

    //1.创建串行队列

    dispatch_queue_t queue = dispatch_queue_create("com.guofu.queue", NULL);

    //2.添加任务到队列中执行任务

    dispatch_sync(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"2---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"3---%@", [NSThread currentThread]);

    });

    //总结:不会开启新的线程

}

/*

 同步(sync)函数

 并发队列:不会开线程

 串行队列:不会开线程

 异步(async)函数

 并发队列:可以开启多条线程,取决去任务的个数

 串行队列:开一条线程

凡是函数名中带有createcopy ew etain.都需要在不需要这个数据的术后进行release

 GCD的数据类型在ARC环境下不需要做release

 CF(core Foundation)的数据类型在ARC下还是要做release

 */

#pragma mark - 第二种获取串行队列的方式

/**

 * 用dispatch_sync同步函数,在主线程中往主队列中添加任务

 * 线程会死掉

 */

- (void)syncMainQueue {

    //1.获取主队列

    dispatch_queue_t queue = dispatch_get_main_queue();

    //2.添加任务到队列中执行

    dispatch_sync(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    //总结:不会开启新的线程,所有任务在主线程中执行,

}

/**

 * 用dispatch_async异步函数,在主线程中往主队列中添加任务

 * 具备开启新线程,但是任务是放在主线程中的,所以不会开启新线程

 */

- (void)asyncMainQueue {

    //1.获取主队列

    dispatch_queue_t queue = dispatch_get_main_queue();

    //2.添加任务到队列中执行

    dispatch_async(queue, ^{

        NSLog(@"1---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"2---%@", [NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"3---%@", [NSThread currentThread]);

    });

    //总结:不会开启新的线程,所有任务在主线程中执行,

}

/**

 * 下载图片的例子

 */

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{

        // 1.根据URL下载图片

        NSURL *url = [NSURL URLWithString:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

        NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时

        UIImage *image = [UIImage imageWithData:data];

        //2.回到主线程显示图片

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageView.image = image;

        });

    });

}

原文地址:https://www.cnblogs.com/guofuzhang/p/5195829.html