GCD包括语言特性、运行库和系统改进,提供系统的、全面的改进并支持在iOS和OS X多核硬件上执行并发代码。
BSD子系统,CoreFoundation和Cocoa接口已扩展,利用这些改进可以使系统和应用运行更快、更有效率以及改进的响应。考虑到单个应用有效的使用多核的困难,更不用说在有不同数目计算核心的电脑上或多个应用程序争抢这些核心的环境上完成。GCD是操作在系统层面上。可以更好的满足正在运行的所有应用程序的需要,以平衡的方式满足他们可用的系统资源。
本文档描述了GCD接口,它支持在Unix系统上异步执行操作。可以利用这个接口来管理与文件描述符、Mach端口、信号或计时器的交互。在OS X v10.7和更高级版本,可以利用GCD来处理通用异步I/O文件描述符操作。
GCD并不局限于系统级应用程序,但是在更高级应用程序中使用它之前,必须考虑在Cocoa中(通过NSOperation和block对象)是否提供类似的功能更容易使用或者更加适合你的需求。更多信息,可以查看并发编程指南。
重要提示
当分支系统调用和GCD一起时必须小心。如果一个程序中在调用分支之前调用GCD,直到成功调用执行程序或相关功能,才能安全的在生成的子进程中调用额外的GCD。
GCD对象和自动引用计数
当使用Object-C编译器构建应用程序时,所有调度对象都是Object-C对象。因此,当启动自动引用计数器(ARC)时,调度对象像其他Object-C对象一样保留和自动释放。当不启用ARC时,使用dispatch_retain和dispatch_release函数(或Objective-C语法)来保留和释放调度对象。不能使用核心框架中的retain/release函数。
如果需要在支持ARC的应用中使用retain/release语法来部署目标(维护现有代码的兼容性),可以通过在编译器标志中添加 -DOS_OBJECT_USE_OBJC=0来禁用基于Objective-C的调度对象。
函数
创建和管理队列
dispatch_get_main_queue
dispatch_get_global_queue
dispatch_queue_create
dispatch_get_current_queue (iOS 6.0)
dispatch_queue_attr_make_with_qos_class
dispatch_queue_get_label
dispatch_set_target_queue
dispatch_main
排队任务的调度
GCD提供并管理先进先出队列,应用程序可以以block对象的形式提交任务。提交到调度队列中的block在线程池里运行,该线程池完全由系统管理。不能保证任务在某个线程上执行。GCD提供了三种队列:
l 主线程:在应用程序的主线程上任务串行执行
l 并行:任务按照先进先出的顺序出队,但任务可以并行允许,可以按照任何顺序完成
l 串行:按照先进先出的顺序一次执行一个任务
主队列是由系统自动创建并且和应用程序主线程相关联。应用程序使用以下三种方法中的一种(只能一种)来调用提交到主线程的block
l 调用dispatch_main
l 调用UIApplicationMain (iOS) 或 NSApplicationMain (OS X)
l 在主线程中使用CFRunLoopRef
可以使用并发队列来执行大量的并发任务。GCD会自动创建是个并发调度队列(在iOS5或OS X v10.7之前是三个),这些队列是全局的,应用程序只能通过他们的优先级进行区分。应用程序请求队列可以使用dispatch_get_global_queue函数。因为这些并发队列是全局的,不需要保留和释放他们,就算调用了retain和release也会被忽略。在OS X v10.7 与其之后版本和iOS 4.3与其之后版本,可以在代码模块中创建额外的并发队列。
使用串行队列保证任务按照可预测的顺序执行。它可以识别每个串行队列的特殊目的,如资源保护换关键程序的同步。应用程序必须显式地创建和管理串行队列。如果需要可以创建更多队列,但在并行队列中尽量避免使用。
重要提示
GCD是一个C语言的API,它不捕获来自更高级语言的异常。应用程序必须在提交到调度队列的block返回之前,捕获所有异常。
dispatch_async
dispatch_async_f
dispatch_sync
dispatch_sync_f
dispatch_after
dispatch_after_f
dispatch_apply
dispatch_apply_f
dispatch_once
dispatch_once_f
使用调度组
组合block使聚合同步成为可能。应用程序可以提交多个block,在它们完成时跟踪,即使它们可能运行在不同的队列。当遇到特定任务完成后程序才能执行的情况时,这种行为很有用。
dispatch_group_async
dispatch_group_async_f
dispatch_group_create
dispatch_group_enter
dispatch_group_leave
dispatch_group_notify
dispatch_group_notify_f
dispatch_group_wait
管理调度对象
GCD提供调度对象接口,允许应用程序管理这方面的进程,例如内存管理、暂停和回复执行、定义对象内容以及记录任务数据。调度对象必须手动retain和release而不是靠垃圾回收。
dispatch_debug (iOS 6.0)
dispatch_get_context
dispatch_release
dispatch_resume
dispatch_retain
dispatch_set_context
dispatch_set_finalizer_f
dispatch_suspend
使用信号
调度信号是一种有效的传统计数信号。只有当需要阻塞调用线程时,调度信号才调用到内核。如果不需要阻塞调用信号,则不需要调用内核。
dispatch_semaphore_create
dispatch_semaphore_signal
dispatch_semaphore_wait
使用屏障?
调度屏障允许在并发调度队列中创建一个同步点。当遇到屏障,并发队列延迟屏障block(或其他block)直到所有的block在屏障完成执行前提交完。在这个点上,屏障block执行。完成后,队列继续其他正常的执行行为。
dispatch_barrier_async
dispatch_barrier_async_f
dispatch_barrier_sync
dispatch_barrier_sync_f
管理调度资源
GCD提供一套调度资源接口用来监听(低级系统对象例如Unix描述符、Mach端口、Unix信号、VFS节点等)活动。当此类活动发生时,并提交时间处理程序到调度队列。当事件发生时,调度资源异步提交任务代码到指定的调度队列进行处理。
dispatch_source_cancel
dispatch_source_create
dispatch_source_get_data
dispatch_source_get_handle
dispatch_source_get_mask
dispatch_source_merge_data
dispatch_source_set_registration_handler
dispatch_source_set_registration_handler_f
dispatch_source_set_cancel_handler
dispatch_source_set_cancel_handler_f
dispatch_source_set_event_handler
dispatch_source_set_event_handler_f
dispatch_source_set_timer
dispatch_source_testcancel
使用调度I/O便利?(Convenience)API
调度I/O 便利?API允许对文件描述符执行异步读写操作。这个API支持基于流访问文件描述符内容。
dispatch_read
dispatch_write
使用调度I/O通道?(Channel)API
利用调度I/O通道API可以管理基于文件描述符的操作。这个API支持基于流和随机访问语法来访问文件描述符的内容。
dispatch_io_create
dispatch_io_create_with_path
dispatch_io_create_with_io
dispatch_io_read
dispatch_io_write
dispatch_io_close
dispatch_io_barrier
dispatch_io_set_high_water
dispatch_io_set_low_water
dispatch_io_set_interval
dispatch_io_get_descriptor
管理调度数据对象
调度数据对象提供一个接口来管理基于内存的数据缓冲区。客户端访问数据缓冲区时将它看做一个连续的内存块,但缓冲区在内部可能由多个不连续的内存块组成。
dispatch_data_create
dispatch_data_get_size
dispatch_data_create_map
dispatch_data_create_concat
dispatch_data_create_subrange
dispatch_data_apply
dispatch_data_copy_region
管理时间
dispatch_time
dispatch_walltime
管理特定队列数据
dispatch_queue_set_specific
dispatch_queue_get_specific
dispatch_get_specific
数据类型
dispatch_block_t
dispatch_function_t
dispatch_group_t
dispatch_object_t
dispatch_once_t
dispatch_queue_t
dispatch_time_t
dispatch_source_type_t
dispatch_fd_t
dispatch_data_t
dispatch_data_applier_t
dispatch_io_t
dispatch_io_handler_t
dispatch_io_type_t
dispatch_io_close_flags_t
dispatch_io_interval_flags_t
常量
dispatch_queue_priority_t
dispatch_source_mach_send_flags_t
dispatch_source_proc_flags_t
dispatch_source_vnode_flags_t
dispatch_source_memorypressure_flags_t
Data Object Constants
Data Destructor Constants
Dispatch Queue Types
Dispatch Source Type Constants
Dispatch Time Constants
Time Multiplier Constants
Dispatch I/O Channel Types
Channel Closing Options
Channel Configuration Options
官方原文: