版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.11.04 |
前言
在app中,在多线程等很多时候都会使用
Dispatch
。下面我们就详细解析一下这个框架的详细情况。
Overview
首先看一下该框架的基本信息
下面看一下该框架的基本结构。
Dispatch
通过提交工作来调度由系统管理的队列,在多核硬件上同时执行代码。
Grand Central Dispatch(GCD)
包含语言功能,运行时库和系统增强功能,可为macOS,iOS,watchOS和tvOS上的多核硬件上的并发代码执行支持提供系统,全面的改进。
BSD
子系统,Core Foundation
和Cocoa API
已经全部扩展到使用这些增强功能来帮助系统和应用程序更快,更高效地运行并提高响应速度。 考虑单个应用程序有效地使用多个内核是多么的困难,更不用说在具有不同数量的计算核心的不同计算机上或者在具有多个应用程序的环境中竞争这些内核。 在系统级运行的GCD可以更好地适应所有正在运行的应用程序的需求,并以均衡的方式将它们与可用的系统资源进行匹配。
Dispatch 对象和ARC
当您使用Objective-C编译器构建应用程序时,所有dispatch
对象都是Objective-C对象。 因此,启用自动引用计数(ARC)时,dispatch
对象将被自动保留和释放,就像任何其他Objective-C对象一样。 当ARC未启用时,使用dispatch_retain
和dispatch_release函数(或Objective-C语义)来保留并释放您的调度对象。 您不能使用Core Foundation retain/release
函数。
如果您需要在启用了ARC的应用程序中使用retain/release
语义,并使用更高的部署目标(以保持与现有代码的兼容性),则可以通过将-DOS_OBJECT_USE_OBJC = 0
添加到编译器标志来禁用基于Objective-C的dispatch对象。
Dispatch基本概览
1. Managing Dispatch Queues
GCD提供并管理您的应用程序可以以块对象的形式提交任务的FIFO队列。 提交给dispatch队列的工作在由系统完全管理的线程池上执行。 不保证执行任务的线程。
-
Dispatch Queue Types
- 创建新的dispatch队列时使用的属性。
-
Dispatch Queue Label Constants
- dispatch_queue_get_label函数的常数。
-
dispatch_queue_t
- 一个dispatch队列是一个轻量级的对象,应用程序为了后续执行而提交块。
-
dispatch_get_main_queue
- 返回主线程关联的串行dispatch队列。
-
dispatch_get_global_queue
- 根据指定的服务类的质量,返回一个系统定义的全局并发队列。
-
dispatch_get_current_queue- 返回当前block正在运行的队列。
-
dispatch_set_target_queue
- 为给定的对象设置目标队列。
-
dispatch_async
- 为在dispatch队列中异步执行提交一个block,并立即返回。
-
dispatch_async_f
- 在调度队列中提交应用程序定义的异步执行函数,并立即返回。
-
dispatch_sync_f
- 提交应用程序定义的函数,用于在调度队列上同步执行。
-
dispatch_after
- 在指定的时间排队执行block。
-
dispatch_after_f
- 在指定的时间排队一个应用程序定义的函数以供执行。
-
dispatch_apply_f
- 将一个应用程序定义的函数提交给调度队列以进行多个调用。
-
dispatch_queue_get_label
- 返回创建队列时为队列指定的标签。
-
dispatch_get_specific
- 返回与当前分派队列关联的键的值。
-
dispatch_queue_set_specific
- 设置指定调度队列的键/值数据。
-
dispatch_queue_get_specific
- 获取与指定调度队列关联的键的值。
-
dispatch_once_t
- 用于dispatch_once函数的谓词。
-
dispatch_once
- 在应用程序的整个生命周期中,一次且只能执行一次块对象。
-
dispatch_once_f
- 在应用程序的整个生命周期中,只执行一次应用程序定义的函数。
-
dispatch_main
- 执行提供给主队列的块。
2. Managing Units of Work
调度Dispatch块允许您直接配置队列中各个工作单元的属性。 他们还允许您为了等待完成,收到通知完成和/或取消它们的目的,处理个别工作单位。
-
dispatch_block_t
- 提交给调度队列的块原型,不带任何参数,没有返回值。
-
dispatch_function_t
- 提交给调度队列的函数原型。
-
dispatch_block_create
- 使用现有的块和给定的标志在堆上创建新的分派块。
-
dispatch_block_create_with_qos_class
- 在现有块和给定标志的堆上创建一个新的调度块,并为其指定QoS等级和相对优先级。
-
dispatch_block_perform
- 创建,同步执行,并从指定的块和标志释放调度块。
-
dispatch_block_wait
- 同步等待,直到指定的调度块的执行完成,或者直到超过指定的超时时间。
-
dispatch_block_notify
- 当指定的调度块的执行完成时,安排通知块被提交给队列。
-
dispatch_block_cancel
- 异步取消指定的分派块。
-
dispatch_block_testcancel
- 测试给定的调度块是否被取消。
-
dispatch_block_flags_t
- 传递给dispatch_block_create和dispatch_block_create_with_qos_class函数的标志位。
3. Prioritizing Work and Specifying Quality of Service
-
Dispatch Queue Priorities
- 用于选择合适的全局并发队列。
dispatch_qos_class_t
dispatch_queue_attr_t
dispatch_queue_priority_t
dispatch_queue_get_qos_class
-
dispatch_queue_attr_make_with_qos_class
- 返回适合于创建具有所需服务质量信息的调度队列的属性。
4. Using Dispatch Groups
分组块允许聚合同步。 您的应用程序可以提交多个块,并在完成时跟踪,即使它们可能运行在不同的队列中。 如果在完成所有指定任务之后才能进行此操作,则此行为会很有帮助。
-
dispatch_group_t
- 一组块对象提交到队列以进行异步调用。
-
dispatch_group_async
- 将块提交到调度队列,并将块与指定的调度组相关联。
-
dispatch_group_async_f
- 将应用程序定义的函数提交给调度队列,并将其与指定的调度组相关联。
-
dispatch_group_notify_f
- 当一组先前提交的块对象完成时,安排应用程序定义的函数提交给队列。
-
dispatch_group_wait
- 同步等待先前提交的块对象完成; 如果在指定的超时期限过去之前块没有完成,则返回。
5. Using Dispatch Semaphores
调度信号量是传统计数信号量的有效实现。 只有当调用线程需要被阻塞时,调度信号才会调用内核。 如果调用信号量不需要阻塞,则不进行内核调用。
dispatch_semaphore_t
-
dispatch_semaphore_wait
- 等待(递减)信号量。
6. Using Dispatch Barriers
调度阻塞允许您在并发调度队列中创建同步点。 当遇到障碍时,并发队列会延迟屏障块(或任何其他块)的执行,直到在屏障完成执行之前提交的所有块为止。 在这一点上,障碍块自行执行。 完成后,队列恢复正常的执行行为。
-
dispatch_barrier_async
- 为异步执行提交barrier块并立即返回。
-
dispatch_barrier_async_f
- 提交异步执行的barrier函数并立即返回。
-
dispatch_barrier_sync
- 提交barrier块对象执行,并等待该块完成。
-
dispatch_barrier_sync_f
- 提交执行的barrier函数,并等待该函数完成。
7. Using Dispatch Data
-
Dispatch Data Object Constants
- 表示数据对象的常量
-
Dispatch Data Destructor Constants
- 表示用于数据对象的析构函数的常量。
-
dispatch_data_t
- 表示内存连续或稀疏区域的不可变对象。
-
dispatch_data_applier_t
- 用于调用数据对象中每个连续内存区域的块。
-
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
- 返回包含另一个数据对象中的部分数据的数据对象。
8. Using Dispatch Time
-
Dispatch Time Constants
- 基本时间常数。
-
Dispatch Time Multiplier Constants
- 用于计算时间值的乘数。
-
dispatch_time_t
- 一个有点抽象的时间表示。
-
dispatch_time
- 创建相对于默认时钟的
dispatch_time_t
或修改现有的dispatch_function_t
。
- 创建相对于默认时钟的
-
dispatch_walltime
- 根据wall钟创建使用绝对时间的
dispatch_function_t
。
- 根据wall钟创建使用绝对时间的
dispatch_autorelease_frequency_t
9. Managing Dispatch Sources
-
OS_dispatch_source
- 定义与所有分派源类型共享的一组公共属性和方法。
-
Dispatch Source Type Constants
- dispatch sources的类型。
-
Dispatch Source Mach Send Event Flags
- Mach发送事件标志。
-
Dispatch Source Process Event Flags
- 过程事件标志位。
-
Dispatch Source Vnode Event Flags
- 文件系统对象事件标志位。
-
Dispatch Source Memory Pressure Event Flags
- 内存压力事件标志位。
dispatch_source_t
-
dispatch_source_type_t
- 由调度源监视的类型系统对象的标识符。
dispatch_source_mach_send_flags_t
dispatch_source_memorypressure_flags_t
dispatch_source_proc_flags_t
-
dispatch_fd_t
- 用于I/O操作的文件描述符。
-
dispatch_source_create
- 创建一个新的调度源来监视低级系统对象,并自动提交一个处理程序块到调度队列以响应事件。
-
dispatch_source_get_data
- 返回调度源的待处理数据。
-
dispatch_source_get_handle
- 返回与指定调度源关联的底层系统句柄。
-
dispatch_source_get_mask
- 返回调度源监视的事件的掩码。
-
dispatch_source_merge_data
- 将数据合并到类型为
DISPATCH_SOURCE_TYPE_DATA_ADD或DISPATCH_SOURCE_TYPE_DATA_OR
的调度源中,并将其事件处理程序块提交给其目标队列。
- 将数据合并到类型为
-
dispatch_source_set_timer
- 为定时器源设置开始时间,间隔和余量值。
-
dispatch_source_set_registration_handler
- 为给定的调度源设置注册处理程序块。
-
dispatch_source_set_registration_handler_f
- 为给定的调度源设置注册处理函数。
-
dispatch_source_set_event_handler
- 为给定的调度源设置事件处理程序块。
-
dispatch_source_set_event_handler_f
- 为给定的调度源设置事件处理函数。
-
dispatch_source_set_cancel_handler
- 为给定的调度源设置取消处理程序块。
-
dispatch_source_set_cancel_handler_f
- 为给定的调度源设置取消处理函数
-
dispatch_source_cancel
- 异步取消调度源,阻止任何进一步的调用其事件处理程序块。
-
dispatch_source_testcancel
- 测试给定的调度源是否被取消。
dispatch_source_timer_flags_t
dispatch_source_vnode_flags_t
10. Managing Dispatch I/O
调度I / O通道API允许您管理基于文件描述符的操作。 该API支持基于流的和随机访问语义来访问文件描述符的内容。
-
Dispatch I/O Channel Types
- 可能创建的调度I / O通道的类型。
-
Dispatch I/O Channel Closing Options
- 关闭调度I / O通道时使用的选项。
-
Dispatch I/O Channel Configuration Options
- 配置通道时使用的选项。
-
dispatch_io_t
- 一个
dispatch I/O
通道
- 一个
-
dispatch_io_type_t
- dispatch I/O 通道类型。
-
dispatch_io_handler_t
- 处理程序块用于处理调度I / O通道上的操作。
-
dispatch_io_close
- 将指定的通道关闭到新的读取和写入操作。
-
dispatch_io_close_flags_t
- 用于指定通道关闭选项的标志类型。
-
dispatch_io_set_interval
- 设置调用通道的I / O处理程序的间隔(以纳秒为单位)。
-
dispatch_io_interval_flags_t
- 用于指定通道调度间隔的标志类型。
11. Working with Dispatch Objects
GCD提供了调度对象接口,使您的应用程序能够管理诸如内存管理,暂停和恢复执行,定义对象上下文以及记录任务数据等方面的处理。 调度对象必须手动保留和释放,而不是垃圾收集。
dispatch_object_t
-
dispatch_activate
- 激活调度对象。
dispatch_debugdispatch_debugv-
dispatch_retain
- 递增调度对象的引用(保留)计数。
-
dispatch_release
- 减少调度对象的引用(保留)计数。
-
dispatch_get_context
- 返回对象的应用程序定义的上下文。
-
dispatch_set_context
- 将应用程序定义的上下文与对象关联。
-
dispatch_set_finalizer_f
- 设置调度对象的终结器函数。
dispatch_assert_queue
dispatch_assert_queue_barrier
dispatch_assert_queue_not
dispatch_introspection_hook_queue_callout_begin
dispatch_introspection_hook_queue_callout_end
dispatch_introspection_hook_queue_create
dispatch_introspection_hook_queue_destroy
dispatch_introspection_hook_queue_item_complete
dispatch_introspection_hook_queue_item_dequeue
dispatch_introspection_hook_queue_item_enqueue
dispatch_queue_attr_make_initially_inactive
dispatch_queue_attr_make_with_autorelease_frequency
12. Protocols
OS_dispatch_data
OS_dispatch_group
OS_dispatch_io
OS_dispatch_object
OS_dispatch_queue
OS_dispatch_queue_attr
OS_dispatch_semaphore
13. Reference
- Dispatch Functions
后记
未完,待续~~~