您的位置:首页 > 移动开发 > IOS开发

iOS开发:GCD

2018-02-20 16:38 344 查看
       在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原则:先进先出,后进后出。


      (二)执行任务
        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.同步和异步的区别           同步:只能在当前线程中执行任务,不具备开启新线程的能力;
           异步:可以在新的线程中执行任务,具备开启新线程的能力。



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



         四、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]);
    });
}



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


以上就是这篇GCD博文的全部内容,欢迎关注三掌柜微信公众号,更多精彩等您来,欢迎关注!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: