免费开源的iOS开发学习平台

GCD使用介绍:1-基本概念介绍

GCD(Grand Central Dispatch)技术,苹果首先应用于OSX中,随后在iOS中也引入了GCD技术。特别是苹果把CPU升级为多核后,GCD的使用变得更加广泛和重要。相比于NSThread, GCD中已经完全屏蔽了有关线程的概念,而是引入了任务和队列,把任务放到队列中执行,指定任务和队列的类型,其他有关线程管理的事务完全交由GCD来处理,大大简化了多任务开发的难度。

GCD简介

GCD是Grand Central Dispatch的缩写,GCD是苹果推出的专门用于简化多线程编程的技术。在GCD中,程序员已经不再需要去关心有关线程的操作(如:线程创建、线程销毁、线程调度),而是引入了任务和队列两个核心概念。

由于GCD是苹果推出的技术,因此GCD能够很好的调度苹果设备的CPU资源,不论是在Mac平台,还是在iOS平台。特别是iPhone中引入多核CPU之后,GCD的使用就变得越发重要。

由于GCD对线程管理进行了封装,因此,当工程师使用GCD时,只需要把任务(通常封装在一个block中)添加到一个队列中执行,有关线程调度的工作,完全交由GCD完成。

在使用GCD处理多任务执行时,只要按照如下步骤执行即可,

  • 在block中定义需要执行的任务内容;

  • 把任务添加到队列queue中

GCD对队列中的任务,按照“先进先出”的原则,根据任务添加到队列的顺序来对队列进行处理,GCD会根据任务和队列的类型,自动在多个线程之间分配工作。

任务

在GCD中,需要处理的事务统一使用block封装起来,称为任务。任务有两种类型,同步任务和异步任务。我们通过调用不同的函数,来设置任务的类型。同时,任务编写在函数的block参数中。

  • 异步任务:执行任务时,会在另外的线程中执行,即可能会创建新的线程;
dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 
  • 同步任务:执行任务时,会在当前的线程中执行,当前线程有可能是主线程,也有可能是子线程。
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); 

队列

GCD中,队列是一个重要概念。系统提供了若干预定义的队列,其中包括可以获取应用程序的主队列(任务始终在主线程上执行,与更新UI相关的操作必须在主队列中完成)。另外,工程师可以自由创建不同类型的队列,例如:并行队列和串行队列,队列的类型决定了任务的执行方式。GCD队列严格按照“先进先出”的原则,添加到GCD队列中的任务,始终会按照加入队列的顺序被执行。

  • 并行队列:并行队列中的任务可以在多个线程之间分配执行,分配的原则由GCD控制,因此,并行队列中的任务,虽然分配执行时按照先进先出进行分配的,但由于各个任务被分配到不同的线程执行,因此其完成时间有可能不同,即:后分配的任务有可能先执行完成;并发队列一定需要和异步执行的任务(使用dispatch_async())结合起来使用才有意义。

  • 串行队列:串行队列中的任务是按照顺序一个一个完成的,当一个任务完成后,才去执行下一个任务;因此,串行队列对应一个线程执行。

  • 主队列:主队列也是一个串行队列,主队列中的任务都在主线程中执行。

程序员可以通过如下的函数来创建不同类型的队列。

  • 获取系统定义的并行队列,一般来说,开发中通常不需要自己创建并行队列,使用系统提供的即可
dispatch_get_global_queue(long identifier, unsigned long flags);
  • 创建队列。可以创建并行队列,也可以创建串行队列。该方法常用于创建串行队列。
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
  • 获取主队列
dispatch_get_main_queue(void);