GCD概要

什么是 GCD 呢?以下摘自苹果的官方说明

      Grand Central Dispatch (GCD)是异步执行任务的技术之一。一般将管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD就能生成必要的线程并计划执行任务。


GCD概要_第1张图片
上面就是在后台线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。

相比 Cocoa 框架提供了 NSObject类等简单的多线程编程技术,GCD 更为简洁。


线程

     1个 CPU 执行的 CPU 命令列为一条无分叉路径,即为“线程”。存在多条时,即为“多线程”。

      多线程编程实际上是一种易发生各种问题的编程技术。比如多个线程更新相同的资源会岛主数据的不一致(数据竞争)、停止等待事件的线程会导致多个线程相互持续等待(死锁)、使用太多线程会消耗大量内存等。

       但是多线程可保证应用程序的响应性能,长时间的处理不在主线程执行而在其他线程执行可以保证用户界面的响应性能。


Dispatch Queue

       dispatch_queue 是什么呢?如其名称所示,是执行处理的等待队列。应用程序编程人员通过 dispatch_async 函数等 API,在 Block 语法中记述想执行的处理并将其追加到 Dispatch Queue 中。Dispatch Queue 按照先进先出的顺序执行处理。

分类: 1.Serial Dispatch Queue 等待现在执行中处理结束。(串行)

          2.Concurrent Dispatch Queue 不等待现在执行中处理结束。(并行)并行执行的处理数取决于系统的状态,即 iOS和 OS X 基于Dispatch Queue 中的处理数、CPU 核数以及 CPU 负荷等当前系统的状态。


如何获取这些 Dispatch Queue 呢?

方法一:通过 GCD的 API dispatch_queue_create 函数可生成 Dispatch Queue,该函数的第一个参数指定 Dispatch Queue 的名称;

生成 Serial Dispatch Queue 时,将第二个参数指定为 NULL;

系统对于每一个 Serial Dispatch Queue 就生成并使用一个线程。

dispatch_queue_t mySerialDispatchQueue = 

     dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);

       只在为了避免多线程编程问题之一——多个线程更新相同资源导致数据竞争时使用 Serial Dispatch Queue。

       当想并行执行不发生数据竞争等问题的处理时,使用 Concurrent Dispatch Queue。

生成 Concurrent Dispatch Queue 时指定为 DISPATCH_QUEUE_CONCURRENT;

dispatch_queue_t myConurrentDispatchQueue = dispatch_queue_create(

"com.example.gcd.MyConcurrentDispatchQueue",DISPATCH_QUEUE_CONCURRENT)

返回值为表示 Dispatch Queue 的“dispatch_queue_t 类型”

在使用后通过 dispatch_release 函数释放

dispatch_release(mySerialDispatchQueue)

相应的也会存在 dispatch_retail 函数

dispatch_retain(myConcurrentDispatchQueue)


方法二:获取系统标准提供的 Dispatch Queue

Main Dispatch Queue(主线程,Serial Dispatch Queue) 

dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

Global Dispatch Queue (Concurrent Dispatch Queue)

4个优先级

{

 /*High Priority (高优先级)*/

dispatch_queue_t globalDispatchQueueHigh = 

          dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH,0);

/*Default Priority (默认优先级)*/

dispatch_quque_t globalDispatchQueueDefault = 

           dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

/*low Priority  (低优先级)*/

dispatch_quque_t globalDispatchQueueLow =

           dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);

/*Background Priority (后台优先级)*/

dispatch_quque_t globalDispatchQueueBackground =

           dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);

}

你可能感兴趣的:(GCD概要)