美文网首页
dispatch_block_t详解

dispatch_block_t详解

作者: 野码道人 | 来源:发表于2021-08-22 15:07 被阅读0次

概览

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等级系统。

相关文章

网友评论

      本文标题:dispatch_block_t详解

      本文链接:https://www.haomeiwen.com/subject/jkwciltx.html