iOS开发:GCD

       在iOS开发中经常会用到GCD,如果你在求职过程中GCD的使用也是面试官必问的,那么今天就来说说GCD的有关内容,不喜勿喷。

       一、GCD的概念

       1.GCD全称是Grand Central Dispatch,可译为“CPU的中枢调度器”,是C语言,提供了非常多的强大的函数。

       2.GCD的优势:GCD是苹果公司为多核的并行运算提出的解决方案,它会自动利用更多的CPU内核(比如四核),而且它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),开发者只需告诉GCD想要执行什么任务,不需编写任何线程管理代码。

      二、GCD的核心

      GCD的两个核心内容:任务和队列。

      1.任务:执行什么样的操作;

      2.队列:拿来存放任务。

      三、GCD的使用

       GCD的使用只需两步即可:制定任务、将任务添加到队列中。

       1.制定任务:确定想要做的事情;

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

iOS开发:GCD_第1张图片

      (二)执行任务

        GCD中有两个用来执行任务的函数:同步和异步

        1.同步执行任务的方法:

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

queue:队列       block:任务   

        2.异步执行任务的方法:

            dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

        3.同步和异步的区别

           同步:只能在当前线程中执行任务,不具备开启新线程的能力;
           异步:可以在新的线程中执行任务,具备开启新线程的能力。

iOS开发:GCD_第2张图片

        (三)队列的类型

          GCD的队列分为两个类型:串行和并发
          并发队列(Concurrent Dispatch Queue):可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)注意:   并发功能只有在异步(dispatch_async)函数下才有效执行。
          串行队列(Serial Dispatch Queue):让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)。

iOS开发:GCD_第3张图片

         四、GCD相关内容

        1.GCD中有4个术语比较容易混淆:同步、异步、并发、串行
         2.同步和异步二者的主要影响:能否开启新的线程;
         同步:在当前线程中执行任务,不具备开启新线程的能力
         异步:在新的线程中执行任务,具备开启新线程的能力
         3.并发和串行二者的主要影响:任务的执行方式
         并发:多个任务并发(同时)执行
         串行:一个任务执行完毕后,再执行下一个任务
         注意:同步函数+主队列 == 死锁(会卡死)
         (值得注意的是,同步任务有一个特性是,只要一添加到队列中就要立马执行,主队列中永远就只有一条线程——主线程,此时主线程在等待着主队列调度同步任务,而主队列发现主线程上还有任务未执行完,就不会让同步任务添加到主线程上,由此就造成了互相等待(主队列在等待主线程执行完已有的任务,而主线程又在等待主队列调度同步任务,此时就造成所谓的死锁了。)


         示例代码如下:

//主队列(会卡死)

- (void)syncMainQueue {

    //1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)

    dispatch_queue_t queue = dispatch_get_main_queue();

    //2.添加任务,到主队列中,异步执行

    dispatch_sync(queue, ^{

        NSLog(@"下载视频1---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"下载视频2---%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"下载视频3---%@", [NSThread currentThread]);

    });

}

iOS开发:GCD_第4张图片

4.各种队列的执行效果,如下图所示:

iOS开发:GCD_第5张图片



以上就是这篇GCD博文的全部内容,欢迎关注三掌柜微信公众号,更多精彩等您来,欢迎关注!

iOS开发:GCD_第6张图片







你可能感兴趣的:(iOS开发)