程序员

IOSGCD简单使用

2017-11-02  本文已影响36人  _CLAY_

GCD并不是多线程技术 而是并发解决技术

简介:
什么是GCD?--全称是 Grand Central Dispatch ,可译为“牛逼的中枢调度器”
纯C语言,提供了非常强大的函数


GCD的优势
1. GCD是苹果公司为多核的并行运算提出的解决方案
2. GCD会自动利用更多的CPU内核(比如双核、四核)
3. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4. 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
GCD中有2个核心概念
1. 任务:执行什么操作
2. 队列:用来存放任务
GCD的使用就2个步骤
1. 定制任务 -- (确定想做的事情)
2. 将任务添加到队列中
* GCD会自动将队列中的任务取出,放到对应的线程中执行
* 任务的取出遵循队列的FIFO原则:先进先出,后进后出

GCD 常见代码

同步执行方法,这句话不执行完,就不会执行下一任务,同步执行不会开启线程

//1.创建队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2.任务添加到队列中
//2.1 定义任务 -- block
    void(^task)() = ^() {
        NSLog(@"%@",[NSThread currentThread]);
    };
//2.2 添加任务到队列,并且会执行
dispatch_sync(q, task);

异步执行任务 如果任务没有执行完毕,可以不用等待,异步执行下一个任务
具备开启线程的能力! 异步通常又是多线程的代名词

    //1.创建队列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    //2.定义任务 block
    void(^task)() = ^() {
        NSLog(@"%@",[NSThread currentThread]);
    };
    //3.添加任务到队列
    dispatch_async(q, task);

GCD的方法

    // 指定任务执行方法 -- 异步
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    //耗时操作
        NSLog(@"%@",[NSThread currentThread]);
    //主队列 就是专门负责在主线程上调度任务的队列
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"更新UI %@",[NSThread currentThread]);
        });
    });

GCD 核心概念:将任务添加到队列,指定任务执行的方法

//MARK:串行队列,同步任务
//    1.队列 - 串行
    /**
     1. 队列的名称:
     2. 队列的属性:NULL / DISPATCH_QUEUE_SERIAL 串行队列
     */
    dispatch_queue_t q = dispatch_queue_create("WBC", NULL);
//    2.同步执行任务
    dispatch_sync(q, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
//MARK:串行队列,异步任务
//    1.队列 - 串行
    dispatch_queue_t q = dispatch_queue_create("WBC", NULL);
    dispatch_async(q, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
//MARK:并发队列,同步执行
/**
     1. 队列的名称:
     2. 队列的属性:DISPATCH_QUEUE_CONCURRENT 并发队列
     */
dispatch_queue_t q = dispatch_queue_create("WBC", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(q, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
//MARK:并发队列,异步执行
dispatch_queue_t q = dispatch_queue_create("WBC", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(q, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });

小结:

- 开不开线程,取决于执行任务的函数,同步不开,异步才可能开
- 开几条线程,取决于队列,串行开一条,并发可以开多条(异步)
上一篇 下一篇

猜你喜欢

热点阅读