Grand Central Dispatch(GCD):系统管理线程,你不需要编写线 程代码。只需定义想要执行的任务,然后添加到适当的 dispatch queue。GCD 会负责创建线程和调度你的任务。系统直接提供线 程管理,比应用实现更加高效。
-
支持建立基于图的operation objects依赖。可以阻止某个operation 运行,直到它依赖的所有 operation 都已经完成。
-
支持可选的 completion block,在 operation 的主任务完成后调用。
-
支持应用使用 KVO 通知来监控 operation 的执行状态。
-
支持 operation 优先级,从而影响相对的执行顺序
-
支持取消,允许你中止正在执行的任务
dispatch queue 是类似于对象的结构体,管理你提交给它的任务,而且都是 先进先出的数据结构。因此 queue 中的任务总是以添加的顺序开始执行。GCD 提供了几种 dispatch queues,不过你也自己创建。
类型 |
描述 |
串行 |
也称为 private dispatch queue,每次只执行一个任务,按任务 添加顺序执行。当前正在执行的任务在独立的线程中运行(不 同任务的线程可能不同),dispatch queue 管理了这些线程。 通常串行 queue 主要用于对特定资源的同步访问。 你可以创建任意数量的串行 queues,虽然每个 queue 本身每 次只能执行一个任务,但是各个 queue 之间是并发执行的。 |
并发 |
也称为 global dispatch queue,可以并发执行一个或多个任务 但是任务仍然是以添加到 queue 的顺序启动。每个任务运行 于独立的线程中,dispatch queue 管理所有线程。同时运行的 任务数量随时都会变化,而且依赖于系统条件。 你不能创建并发 dispatch queues。相反应用只能使用三个已 经定义好的全局并发 queues。 |
Main dispatch
queue
|
全局可用的串行 queue,在应用主线程中执行任务。这个 queue 与应用的 run loop 交叉执行。由于它运行在应用的主线程,main queue 通常用于应用的关键同步点。 虽然你不需要创建 main dispatch queue,但你必须确保应用 适当地回收 |
-
dispatch queues 相对其它 dispatch queues 并发地执行任务,串行化任务只 能在同一个 dispatch queue 中实现。
-
系统决定了同时能够执行的任务数量,应用在 100 个不同的 queues 中启 动 100 个任务,并不表示 100 个任务全部都在并发地执行(除非系统拥有 100 或更多个核)
-
系统在选择执行哪个任务时,会考虑 queue 的优先级。
-
queue中的任务必须在任何时候都准备好运行,注意这点和Operation对
象不同。 private dispatch queue 是引用计数的对象。你的代码中需要 retain 这些 queue,另外 dispatch source 也可能添加到一个 queue,从而增加 retain 的计数。因此你必须确保所有 dispatch source 都被取消,而且适当地调用 release。(虽然 dispatch queue 是引用计数的对象,但你不需要 retain 和 release 全局并 发 queue。因为这些 queue 对应用是全局的,retain 和 release 调用会被忽略。 你也不需要存储这三个 queue 的引用,每次都直接调 用 dispatch_get_global_queue 获得 queue 就行了.) 你不需要 retain 或 release 全局 dispatch queue,包括全局并发 dispatch queue 和 main dispatch queue。
读写数据时,你总是应该配置描述符使用非阻塞操作,虽然你可以使
使用 dispatch queue 执行的 block 对象不能调用以下函数:
pthread_detach
pthread_cancel
pthread_join
pthread_kill
任务运行时修改线程状态是可以的,但你必须还原线程原来的状态。 只要你记得还原线程的状态,下面函数是安全的:
特定 block 的执行线程可能在多次调用间会发生变化,因此应用不应 该依赖于以下函数返回的信息: