快速理解GCD

来源:互联网 发布:天刀捏脸数据 帅哥 编辑:程序博客网 时间:2024/05/17 08:53

一、什么是GCD


GCD是苹果官方提供的一种多线程自动管理解决方案。全称是Grand Central Dispatch

为什么用它?

它是苹果为多核的并行运算提出的一个解决方案

它会自动利用cpu内核

它会自动管理线程的生命周期(创建、销毁)

只要告诉它想要执行什么任务,不需要编写任何管理线程的代码

 结论:这么好当然要用它!


二、什么是任务和队列


 脑补1:

 2个核心概念:

(1)任务:执行什么操作

(2)队列:用来存放的任务

 2个步骤:

 (1) 定制任务

 (2) 确定想做的事情

结论:将队列添加到队列中,GCD会自动将队列中的任务取出放到对应的线程中执行,遵循队列FIFO原则(先进先出,后进后出)


三、怎么执行任务

有2个用来执行任务的函数

      用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

      参数说明:

     queue:队列

     block:任务

      用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

      有啥区别?

      同步:当前线程中执行

      异步:在另一个线程中执行


四、怎么使用队列

简单说就2种队列类型,即并发队列和串行队列

并发队列:可以让多个任务并发(同时进行)

创建方法:默认提供了全局的并发队列,供整个应用使用,不需要手动创建。

串行队列:让任务一个接着一个执行

创建方法:2中途径

 使用 dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>) 创建

 使用主队列

有四个术语比较容易混淆,容易理解错误

写了几行代码,一目了然


#pragma mark - GCD- (void)testGCD {    //打印主线程    NSLog(@"主线程----%@",[NSThread mainThread]);    NSLog(@"\n");        NSLog(@"同步并发队列");    /** 同步并发队列     *  结论:不会开启新的线程,并发队列失去了并发的功能     **/    dispatch_queue_t  queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);        [self syncQueue:queue];        NSLog(@"\n");    NSLog(@"异步并发队列");    /** 异步并发队列     *  结论:同时开启三个子线程     **/    [self asyncQueue:queue];        NSLog(@"\n");    NSLog(@"同步串行队列");    /** 同步串行队列     *  结论:不会开启新的线程     **/    queue = dispatch_queue_create("com233queue", NULL);    [self syncQueue:queue];        NSLog(@"\n");    NSLog(@"异步串行队列");    /** 异步串行队列     *  结论:会开启线程,但是只开启一个线程     **/        [self asyncQueue:queue];    }- (void)syncQueue:(dispatch_queue_t)queue {    dispatch_sync(queue, ^{        NSLog(@"同步下载 1----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"同步下载 2----%@",[NSThread currentThread]);    });    dispatch_sync(queue, ^{        NSLog(@"同步下载 3----%@",[NSThread currentThread]);    });}- (void)asyncQueue:(dispatch_queue_t)queue {    dispatch_async(queue, ^{        NSLog(@"异步下载 1----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"异步下载 2----%@",[NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"异步下载 3----%@",[NSThread currentThread]);    });}



0 0
原创粉丝点击