GCD笔记

作者: Leon_Jiang | 来源:发表于2018-05-04 10:20 被阅读0次

    一 GCD 的好处:
    1)GCD 可用于多核的并行运算
    2)GCD 会自动利用更多的 CPU 内核(比如双核、四核)
    3)GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
    4)程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码

    二 GCD 的任务
    1 同步执行(sync):
    同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
    只能在当前线程中执行任务,不具备开启新线程的能力。
    2 异步执行(async):
    异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
    可以在新的线程中执行任务,具备开启新线程的能力。
    3 注意:异步执行(async)虽然具有开启新线程的能力,但是并不一定开启新线程。这跟任务所指定的队列类型有关

    三 GCD 的队列
    1 采用 FIFO(先进先出)的原则。
    2 串行队列(Serial Dispatch Queue):
    每次只有一个任务被执行。让任务一个接着一个地执行。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)
    3 并发队列(Concurrent Dispatch Queue):
    可以让多个任务并发(同时)执行。(可以开启多个线程,并且同时执行任务)
    4 注意:并发队列的并发功能只有在异步(dispatch_async)函数下才有效

    四 GCD 的使用步骤
    1 创建一个队列(串行队列或并发队列)
    2 将任务追加到任务的等待队列中,然后系统就会根据任务类型执行任务(同步执行或异步执行)

    1)创建队列的方法:
    1 dispatch_queue_create来创建队列,需要传入两个参数,第一个参数表示队列的唯一标识符,用于 DEBUG,可为空,Dispatch Queue 的名称推荐使用应用程序 ID 这种逆序全程域名;第二个参数用来识别是串行队列还是并发队列。DISPATCH_QUEUE_SERIAL 表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并发队列。

    2 例子:
    // 串行队列的创建方法
    dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
    // 并发队列的创建方法
    dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);

    3 特殊的串行队列:
    主队列(Main Dispatch Queue)。
    所有放在主队列中的任务,都会放到主线程中执行。
    可使用dispatch_get_main_queue()获得主队列。
    // 主队列的获取方法
    dispatch_queue_t queue = dispatch_get_main_queue();

    4 全局并发队列(Global Dispatch Queue):
    可以使用dispatch_get_global_queue来获取。需要传入两个参数。第一个参数表示队列优先级,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT。第二个参数暂时没用,用0即可。
    // 全局并发队列的获取方法
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    5 任务的创建方法
    // 同步执行任务创建方法
    dispatch_sync(queue, ^{
    // 这里放同步执行任务代码
    });
    // 异步执行任务创建方法
    dispatch_async(queue, ^{
    // 这里放异步执行任务代码
    });

    6 6种组合方式
    6.1 同步执行 + 并发队列
    在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务。
    6.2 异步执行 + 并发队列
    可以开启多个线程,任务交替(同时)执行。
    6.3 同步执行 + 串行队列
    不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
    6.4 异步执行 + 串行队列
    会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务
    6.5 同步执行 + 主队列
    在不同线程中调用结果也是不一样,在主线程中调用会出现死锁,而在其他线程中则不会。
    6.6 异步执行 + 主队列
    只在主线程中执行任务,执行完一个任务,再执行下一个任务。

    五 GCD 线程间的通信 (其实就是线程的嵌套,比如在子线程完成了耗时操作,回到主线程刷新UI,就是在子线程中嵌套主线程中刷新一下UI)。

    六 GCD 的其他方法
    1 GCD 栅栏方法:dispatch_barrier_async (就是把任务分成前后两段来执行,第一段所有任务执行完了,采取执行第二段)
    2

    相关文章

      网友评论

          本文标题:GCD笔记

          本文链接:https://www.haomeiwen.com/subject/tuorrftx.html