概览
typedef void (^dispatch_block_t)(void);
定义在object.h中,如上,就是一个参数和返回值都为空的block,苹果为其封装了一系列方法,定义在block.h中,如下
- 指定flags和block创建一个新的block
dispatch_block_t
dispatch_block_create(dispatch_block_flags_t flags, dispatch_block_t block);
- 指定flags、block、qos、优先级创建一个新的block
dispatch_block_t
dispatch_block_create_with_qos_class(dispatch_block_flags_t flags,
dispatch_qos_class_t qos_class, int relative_priority,
dispatch_block_t block);
- 根据指定的flags和block创建一个新的block并且同步执行
void
dispatch_block_perform(dispatch_block_flags_t flags,
DISPATCH_NOESCAPE dispatch_block_t block);
- 阻塞当前线程直到block执行完毕或者超时
intptr_t
dispatch_block_wait(dispatch_block_t block, dispatch_time_t timeout);
- 在block执行完毕后同步在queue中提交一个notification_block,注意block若没有执行就释放,notification_block会直接执行
void
dispatch_block_notify(dispatch_block_t block, dispatch_queue_t queue,
dispatch_block_t notification_block);
- 取消一个尚未执行的block,若正在执行则无效
void
dispatch_block_cancel(dispatch_block_t block);
- 检测一个block是否已被取消
intptr_t
dispatch_block_testcancel(dispatch_block_t block);
dispatch_block_t相关两个枚举的定义
DISPATCH_OPTIONS(dispatch_block_flags, unsigned long,
DISPATCH_BLOCK_BARRIER
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x1,
DISPATCH_BLOCK_DETACHED
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x2,
DISPATCH_BLOCK_ASSIGN_CURRENT
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x4,
DISPATCH_BLOCK_NO_QOS_CLASS
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x8,
DISPATCH_BLOCK_INHERIT_QOS_CLASS
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x10,
DISPATCH_BLOCK_ENFORCE_QOS_CLASS
DISPATCH_ENUM_API_AVAILABLE(macos(10.10), ios(8.0)) = 0x20,
);
注释
/*!
* @typedef dispatch_block_flags_t
* 传递给 dispatch_block_create* 函数的标志。
*
* @const DISPATCH_BLOCK_BARRIER
* 指示调度块对象应充当屏障块的标志
* 当提交到 DISPATCH_QUEUE_CONCURRENT 队列时。
* 有关详细信息,请参阅 dispatch_barrier_async()。
* 当直接调用调度块对象时,该标志无效。
*
* @const DISPATCH_BLOCK_DETACHED
* 指示调度块对象应执行分离的标志
* 来自当前执行上下文属性,例如 os_activity_t
* 和当前 IPC 请求的属性(如果有)。关于QoS等级,
* 行为与 DISPATCH_BLOCK_NO_QOS 相同。如果直接调用,
* 块对象将从调用线程中删除其他属性
* 块体的持续时间(在应用分配给
* 块对象,如果有的话)。如果提交到队列,块对象将是
* 使用队列的属性(或任何特定的属性)执行
* 分配给块对象)。
*
* @const DISPATCH_BLOCK_ASSIGN_CURRENT
* 指示应分配执行块对象的标志
* 创建块对象时当前的上下文属性。
* 这适用于诸如 QOS 类、os_activity_t 和
* 当前的 IPC 请求(如果有)。如果直接调用,块对象将
* 在块的持续时间内将这些属性应用到调用线程
* 身体。如果块对象被提交到队列,这个标志将替换
* 将提交的块实例与
* 提交时当前的执行上下文属性。
* 如果一个特定的 QOS 类被分配了 DISPATCH_BLOCK_NO_QOS_CLASS 或
* dispatch_block_create_with_qos_class(),QOS 类优先于
* 此标志指示的 QOS 类分配。
*
* @const DISPATCH_BLOCK_NO_QOS_CLASS
* 指示不应为调度块对象分配 QOS 的标志
* 类。如果直接调用,则块对象将与 QOS 一起执行
* 调用线程的类。如果块对象提交到队列,
* 这替换了关联提交块的默认行为
* 具有提交时当前 QOS 类的实例。
* 如果指定了特定的 QOS 类,则忽略此标志
* dispatch_block_create_with_qos_class()。
*
* @const DISPATCH_BLOCK_INHERIT_QOS_CLASS
* 表示执行提交给一个调度块对象的标志
* 队列应该更喜欢分配给队列的 QOS 类而不是 QOS 类
* 分配给区块(分别与区块相关联)
* 提交)。后者仅在相关队列不存在时使用
* 有一个分配的 QOS 等级,只要这样做不会导致 QOS
* 低于从队列的目标队列继承的 QOS 类的类。
* 当调度块对象被提交到队列时,这个标志是默认的
* 用于异步执行并且在dispatch block对象时没有效果
* 直接调用。如果 DISPATCH_BLOCK_ENFORCE_QOS_CLASS 是
* 也通过了。
*
* @const DISPATCH_BLOCK_ENFORCE_QOS_CLASS
* 表示执行提交给一个调度块对象的标志
* 队列应该更喜欢分配给块的 QOS 类(resp。关联
* 与提交时的块)通过分配给的 QOS 类
* 队列,只要这样做就不会导致较低的 QOS 等级。
* 当调度块对象被提交到队列时,这个标志是默认的
* 用于同步执行或直接调用调度块对象时。
__QOS_ENUM(qos_class, unsigned int,
QOS_CLASS_USER_INTERACTIVE
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x21,
QOS_CLASS_USER_INITIATED
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x19,
QOS_CLASS_DEFAULT
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x15,
QOS_CLASS_UTILITY
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x11,
QOS_CLASS_BACKGROUND
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x09,
QOS_CLASS_UNSPECIFIED
__QOS_CLASS_AVAILABLE(macos(10.10), ios(8.0)) = 0x00,
);
注释
/*!
* @typedef qos_class_t
*
* @抽象
* 抽象的线程服务质量 (QOS) 分类。
*
* @讨论
* 线程服务质量 (QOS) 类是有序抽象表示
* 预期由 pthread、dispatch 执行的工作的性质
* 队列,或 NSOperation。每个类指定一个最大线程调度
* 该频段的优先级(可与相对
* 频带内的优先级偏移),以及服务质量
* 定时器延迟、CPU 吞吐量、I/O 吞吐量、网络的特性
* 套接字流量管理行为等等。
*
* 尽最大努力为每个 QOS 分配可用的系统资源
* 类。服务质量下降只发生在系统资源
* 争用,与 QOS 等级成正比。也就是说,QOS 类
* 代表用户发起的工作尝试达到峰值吞吐量,同时
* 其他工作的 QOS 类尝试实现峰值能量和热
* 效率,即使在没有争用的情况下。最后,使用QOS
* 类不允许线程取代任何可能应用的限制
* 整体流程。
*/
/*!
* @constant QOS_CLASS_USER_INTERACTIVE
* @abstract 一个 QOS 类,表示该线程执行的工作
* 与用户交互。
* @discussion 要求此类工作相对于其他工作以高优先级运行
* 在系统上工作。指定这个 QOS 类是一个运行请求
* 几乎所有可用的系统 CPU 和 I/O 带宽,即使在争用情况下。
* 这不是用于大型任务的节能 QOS 类。使用
* 此 QOS 类应仅限于与用户的关键交互,例如
* 作为处理主事件循环、视图绘制、动画等上的事件。
*
* @constant QOS_CLASS_USER_INITIATED
* @abstract 一个 QOS 类,表示该线程执行的工作
* 由用户发起并且用户可能正在等待
* 结果。
* @discussion 要求此类工作以低于关键用户的优先级运行-
* 交互式工作,但相对高于系统上的其他工作。这
* 不是用于大型任务的节能 QOS 类。它的用途
* 应仅限于用户持续时间足够短的操作
* 在等待结果时不太可能切换任务。典型
* 用户启动的工作将有进度显示
* 占位符内容或模式用户界面。
*
* @constant QOS_CLASS_DEFAULT
* @abstract 系统在更具体的情况下使用的默认 QOS 类
* QOS 等级信息不可用。
* @discussion 要求此类工作以低于关键用户的优先级运行-
* 交互式和用户启动的工作,但相对高于实用程序和
* 后台任务。由 pthread_create() 创建的没有属性的线程
* 指定 QOS 类将默认为 QOS_CLASS_DEFAULT。这个 QOS 类
* 价值不打算用作工作分类,它应该只是
* 在传播或恢复系统提供的 QOS 类值时设置。
*
* @constant QOS_CLASS_UTILITY
* @abstract 一个 QOS 类,表示该线程执行的工作
* 可能会或可能不会由用户发起,并且用户不太可能
* 立即等待结果。
* @discussion 要求此类工作以低于关键用户的优先级运行-
* 交互式和用户发起的工作,但相对高于低级
* 系统维护任务。这个QOS类的使用说明了工作
* 应以节能和热效率的方式运行。的进展
* 实用工作可能会或可能不会向用户表明,但这种效果
* 工作是用户可见的。
*
* @constant QOS_CLASS_BACKGROUND
* @abstract 一个 QOS 类,表示该线程执行的工作不是
* 由用户发起并且用户可能不知道结果。
* @discussion 要求此类工作以低于其他工作的优先级运行。
* 使用这个 QOS 类表示工作应该在最能量的状态下运行
* 和热效率的方式。
*
* @constant QOS_CLASS_UNSPECIFIED
* @abstract 一个 QOS 类值,表示 QOS 的缺失或移除
* 班级信息。
* @discussion 作为 API 返回值,可能表示线程或 pthread
* 属性被配置为与旧 API 不兼容或冲突
* QOS等级系统。
网友评论