Dispatch简介

Dispatch Objects

尽管GCD是纯C语言的,但它被组建成面向对象的风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象一样是引用计数的。最新版本的XCode已经将dispatch objects加入到了ARC大家庭。

Dispatch Queues

GCD的基本概念就是dispatch queue。dispatch queue是一个队列对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务。

GCD中三种队列类型:

    • The main queue: 与主线程功能相同。实际上,提交至main queue的任务会在主线 程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个。

    • Global queues: 全局队列是,并由整个进程共享。进程中存在三个全局队 列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函 数传入优先级来访问队列。

    • 用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这 种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create 创建的队列. 这 些队列是在默认情况下的。正因为如此,它们可以用来完成同步机制, 有点像传统 线程中的mutex。

默认情况下,GCD公开有5个不同的队列:运行在主线程中的main queue,3个不同优先级 的后台队列,以及一个优先级更低的后台队列(用于I/O)。另外,开发者可以创建自定义队 列:串行或者并行队列。自定义队列非常强大,在自定义队列中被调度的所有block都将被 放入到系统的线程池的一个全局队列中。

 

Dispatch简介_第1张图片

提交任务

向一个队列提交任务很简单:调用dispatch_async函数或dispatch_sync。

    • Dispatch_async传入一个队列和一个block。队列会在轮到这个block执行时执行这个 block的代码。函数会立即返回, block会在后台异步执行;

    • Dispatch_sync的使用同dispatch_async,不同的是dispatch_sync会等待block执行 完成后再返回。 

你可能感兴趣的:(Dispatch)