GCD

推出的时间 iOS4 目的是用来取代NSThread(ios2.0推出)的,是 C语言框架,它能够自动利用更多CPU的核数,并且会自动管理线程的生命周期。

    CGD的两个核心概念:任务, 队列

     任务:记为在block中执行的代码。

     队列:用来存放任务的。

     注意事项:

    队列 != 线程!

    队列中存放的任务最后都要由线程来执行!

    队列的原则:先进先出,后进后出(FIFO/ First In First Out)

   

    队列又分为四种种:1 串行队列  2 并发队列 3 主队列4 全局队列

 

    串行队列: 任务一个接一个的执行。

    并发队列: 队列中的任务并发执行。

    主队列: 跟主线程相关的队列,主队列里面的内容都会在主线程中执行(我们一般在主线程中刷新UI)。

    全局队列:一个特殊的并发队列。

  

    并发队列与全局队列的区别:

    1. 并发队列有名称,可以跟踪错误。全局队列没有

    2. 在ARC中两个队列不需要考虑释放内存,但是在MRC中并发队列是创建出来的需要release操作,而全局队列只有一个不需要。

    3. 一般在开发过程中我们使用全局队列。

执行任务的两个函数

   '同步'执行任务:

  dispatch_sync(<#dispatch_queue_t queue#>,<#^(void)block#>)

  '异步'执行任务:

  dispatch_async(dispatch_queue_t queue,<#^(void)block#>)

 

  "同步"和"异步"的区别:

  "同步": 只能在'当前'线程中执行任务,不具备开启新线程的能力.

  "异步": 可以在'新'的线程中执行任务,具备开启新线程的能力.

 

 各个队列的执行效果:

 组合模式

       1. 串行队列同步执行,既在当前线程中顺序执行

       2. 串行队列异步执行,开辟一条新的线程,在该线程中顺序执行

       3. 并行队列同步执行,不开辟线程,在当前线程中顺序执行

       4. 并行队列异步执行,开辟多个新的线程,并且线程会重用,无序执行

       5. 主队列异步执行,不开辟新的线程,顺序执行

       6. 主队列同步执行,会造成死锁('主线程'和'主队列'相互等待,卡住主线程)

线程间通讯:经典案例:子线程进行耗时操作(例如下载更新等)主线程进行UI刷新。

 

1.经典用法(子线程下载(耗时操作),主线程刷新UI):

    dispatch_async(dispatch_get_global_queue(0, 0),^{

       

         // 执行耗时的异步操作...

  dispatch_async(dispatch_get_main_queue(), ^{

                          

        // 回到主线程,执行UI刷新操作

                        

            });

       });

 

    延迟操作

   <1> 调用 NSObject 方法:

    [self performSelector:@selector(run)withObject:nil afterDelay:2.0];

    // 2秒后再调用self的run方法

   

   <2> GCD 函数实现延时执行:

   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

  // 2秒后执行这里的代码... 在哪个线程执行,跟队列类型有关

   }); 

 

 5、队列组的使用:

      项目需求:

   首先:分别异步执行两个耗时操作;

   其次:等两次耗时操作都执行完毕后,再回到主线程执行操作.

   

   使用队列组(dispatch_group_t)快速,高效的实现上述需求.

   

   dispatch_group_t group = dispatch_group_create(); // 队列组

   dispatch_queue_t queue = dispatch_get_global_queue(0, 0); // 全局并发队列

   

   dispatch_group_async(group, queue, ^{        // 异步执行操作1

       // longTime1

   });

   

   dispatch_group_async(group, queue, ^{        // 异步执行操作2

       // longTime2

  });

   

dispatch_group_notify(group, dispatch_get_main_queue(), ^{   

// 在主线程刷新数据

   // reload Data

 });


你可能感兴趣的:(GCD)