美文网首页
GCD官方文档翻译整理

GCD官方文档翻译整理

作者: 花里胡哨00 | 来源:发表于2022-05-25 17:35 被阅读0次

    *Dispatch是一个抽象模型,用于通过简单但

    *强大的API。

    *在核心部分,dispatch提供了串行FIFO队列,块可以被发送到这些队列

    *已提交。提交到这些调度队列的块在池上调用

    *由系统完全管理的线程数。未就

    *将在哪个线程上调用块;然而,我们保证

    *一次将调用提交给FIFO调度队列的一个块。

    *当多个队列有要处理的块时,系统可以自由地

    *分配其他线程以同时调用块。当

    *队列变为空,这些线程将自动释放。

    类型定义 dispatch_queue_t

    *调度队列调用提交给它们的工作项。

    *串行队列(请参阅dispatch_queue_serial_t)。

    *系统管理一组线程,这些线程处理调度队列并调用

    *提交给他们的工作项。

    *从概念上讲,调度队列可能有自己的执行线程,并且

    *队列之间的交互是高度异步的。

    *调度队列通过调用Dispatch_retain()和

    *dispatch_release()。提交到队列的挂起工作项也包含

    *引用队列,直到它们完成为止。一旦所有引用

    *队列已释放,系统将释放队列。

    (调度DECL)DISPATCH_DECL(dispatch_queue);(调度队列)

    类型定义 dispatch_queue_global_t

    *调度全局并发队列是围绕系统线程的抽象

    *调用提交到调度队列的工作项的池。

    *调度全局并发队列在

    *系统管理的线程池。系统将决定有多少线程

    *根据需求和系统负载分配到此池。特别是,

    *系统尝试保持此资源的良好并发级别,

    *并将在太多现有工作线程阻塞时创建新线程

    *系统调用。

    *全局并发队列是一种共享资源,因此它是

    *此资源的每个用户都有责任不提交无限制的

    *此池的工作量,尤其是可能阻塞的工作量

    *导致系统产生大量线程(又称线程

    *爆炸)。

    *提交到全局并发队列的工作项没有排序

    *关于提交顺序和提交工作项目的担保

    *可以同时调用这些队列。

    *Dispatch global concurrent queues是众所周知的全局对象

    *由dispatch_get_global_queue()返回。无法修改这些对象。

    *调用dispatch_suspend()、dispatch_resume()、dispatch_set_context()等。,

    *与此类型的队列一起使用时将不起作用。

    (调度DECL子类)DISPATCH_DECL_SUBCLASS(dispatch_queue_global, dispatch_queue);

    类型定义 dispatch_queue_serial_t

    *调度串行队列调用在FIFO中串行提交给它们的工作项

    *订单。

    *调度序列队列是工作项可以访问的轻量级对象

    *提交以FIFO顺序调用。串行队列将只调用一个

    *一次调用workitem,但独立的串行队列可能各自调用其工作

    *相互关联的项目。

    *串行队列可以彼此为目标(请参阅dispatch_set_target_queue())。这个

    *队列层次结构底部的串行队列提供排除

    *上下文:最多有一个工作项提交到以下队列中的任何队列

    *教权会在任何给定的时间运行。

    *这种层次结构提供了组织应用程序的自然构造

    *周围的子系统。

    *通过传递派生自的调度队列属性来创建串行队列

    * DISPATCH_QUEUE_SERIAL to dispatch_queue_create_with_target().

    (调度DECL子类)DISPATCH_DECL_SUBCLASS(dispatch_queue_main, dispatch_queue_serial);

    类型定义 dispatch_queue_concurrent_t

    *调度并发队列调用并发提交给它们的工作项,

    *并承认屏障工作项的概念。

    *调度并发队列是轻量级对象,常规和

    *可提交屏障工作项。在中调用屏障工作项

    *在FIFO顺序中排除任何其他类型的工作项。

    *可以为同一并发队列并发调用常规工作项,

    *以任何顺序。但是,在任何

    *已调用在他们之前提交的屏障工作项。

    *换句话说,如果串行队列等效于调度中的互斥体

    *实际上,并发队列相当于读写器锁,其中

    *常规项目是读者,障碍是作者。

    *通过传递派生的调度队列属性来创建并发队列

    *从DISPATCH_QUEUE_CONCURRENT到DISPATCH_QUEUE_create_with_target()。

    *注意事项:

    *此时调度并发队列不实现优先级反转

    *调用低优先级常规工作项(读卡器)时避免

    *和正在阻止调用更高优先级的屏障(writer)。

    (调度DECL子类)DISPATCH_DECL_SUBCLASS(dispatch_queue_concurrent, dispatch_queue);

    __BEGIN_DECLS

    函数 dispatch_async

    *@摘要

    *提交块以在调度队列上异步执行。

    *@讨论

    *dispatch_async()函数是提交的基本机制

    *阻止调度队列。

    *对dispatch_async()的调用总是在块执行完后立即返回

    *已提交,并且从不等待调用该块。

    *目标队列确定是串行调用还是

    *与提交到同一队列的其他块并发。

    *串行队列彼此并行处理。

    *@参数队列

    *将块提交到的目标调度队列。

    *系统将在目标队列上保留引用,直到阻塞

    *已完成。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要提交到目标调度队列的块。此函数执行

    *代表调用方执行Block_copy()和Block_release()。

    *此参数中传递NULL的结果未定义。

    #ifdef __BLOCKS__

    API 可用(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    #endif

    函数 dispatch_async_f

    *@摘要

    *提交用于在调度队列上异步执行的函数。

    *@讨论

    *有关详细信息,请参阅dispatch_async()。

    *@参数队列

    *将函数提交到的目标调度队列。

    *系统将在目标队列上保留引用,直到函数

    *已返回。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_async_f()。

    *此参数中传递NULL的结果未定义。

    API 可用(macos(10.6)、ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_async_f(dispatch_queue_t queue,

    void *_Nullable context, dispatch_function_t work);

    函数 dispatch_sync

    *@摘要

    *提交块以在调度队列上同步执行。

    *@讨论

    *但是,将工作项提交到dispatch_async()之类的调度队列

    *dispatch_sync()在工作项完成之前不会返回。

    *提交到具有dispatch_sync()的队列的工作项不遵守某些

    *调用时该队列的队列属性(例如自动释放频率

    *和QOS类)。

    *将导致以当前队列为目标调用dispatch_sync()

    *处于死锁状态。dispatch_sync()的使用也受到相同的限制

    *使用互斥锁可能导致的多方死锁问题。

    *首选使用dispatch_async()。

    *与dispatch_async()不同,在目标队列上不执行retain。因为

    *对该函数的调用是同步的,dispatch_sync()借用

    *调用方的引用。

    *作为一种优化,dispatch_sync()调用线程上的工作项

    *已提交工作项,除非传递的队列是主队列或

    *以其为目标的队列(请参阅dispatch_queue_main\t,

    *dispatch_set_target_queue())。

    *@参数队列

    *将块提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要在目标调度队列上调用的块。

    *此参数中传递NULL的结果未定义。

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);

    #endif

    函数 dispatch_sync_f

    *@摘要

    *提交用于在调度队列上同步执行的函数。

    *@讨论

    *有关详细信息,请参阅dispatch_sync()。

    *@参数队列

    *将函数提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_sync_f()。

    *此参数中传递NULL的结果未定义。

    API可用(macos(10.6)、ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_sync_f(dispatch_queue_t queue,

    void *_Nullable context, dispatch_function_t work);

    dispatch_sync_f(dispatch_queue_t queue,

    void*_Nullable context,dispatch_function\t work);

    /*@函数dispatch_async_and_wait

    *@摘要

    *提交块以在调度队列上同步执行。

    *@讨论

    *但是,将工作项提交到dispatch_async()之类的调度队列

    *dispatch_async_and_wait()在工作项完成之前不会返回。

    *与dispatch_sync系列的函数一样,dispatch_async\u和_wait()是

    *受制于死锁(有关详细信息,请参阅dispatch_sync()。

    *然而,dispatch_async\u和_wait()不同于

    *dispatch_sync系列有两种基本方式:如何尊重队列

    *属性以及它如何选择调用workitem的执行上下文。

    *与dispatch_sync()的差异</b>

    *提交到具有dispatch_async\u和_wait()的队列的工作项全部观察

    *调用时该队列的队列属性(包括自动释放频率

    *或QOS类)。

    *当运行时启动线程以调用异步工作项时

    *已提交到指定队列,该服务线程也将

    *用于执行提交到队列的同步工作

    *dispatch_async_and_wait()。

    *但是,如果运行时没有启动线程来服务指定的

    *队列(因为它没有排队的工作项,或者只有同步工作项),

    *然后dispatch_async_and_wait()将调用调用线程上的工作项,

    *类似于dispatch_sync系列中函数的行为。

    *例外情况是,如果提交工作的队列不是目标队列

    *全局并发队列(例如,因为它以主队列为目标),

    *那么线程调用永远不会调用workitem

    *dispatch_async_and_wait()。

    *换句话说,dispatch_async_and_wait()类似于提交

    *将dispatch_block_create()d工作项发送到队列,然后等待它,如

    *如下面的代码示例所示。但是,dispatch_async_and_wait()是

    *当不需要执行新线程时,效率会显著提高

    *workitem(因为它将使用提交线程的堆栈,而不是

    *需要堆分配)。

    *<代码>

     *    dispatch_block_t b = dispatch_block_create(0, block);

     *    dispatch_async(queue, b);

     *    dispatch_block_wait(b, DISPATCH_TIME_FOREVER);

     *    Block_release(b);

    *</代码>

    *@参数队列

    *将块提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要在目标调度队列上调用的块。

    *此参数中传递NULL的结果未定义。

    */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_async_and_wait(dispatch_queue_t queue,

    DISPATCH_NOESCAPE dispatch_block_t block);

    #endif

    *@函数dispatch_async_and_wait_f

    *@摘要

    *提交用于在调度队列上同步执行的函数。

    *@讨论

    *有关详细信息,请参阅dispatch_async_and_wait()。

    *@参数队列

    *将函数提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_async\u和_wait_f()。

    *此参数中传递NULL的结果未定义。

    */

    API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_async_and_wait_f(dispatch_queue_t queue,

    void *_Nullable context, dispatch_function_t work);

    #if defined(__APPLE__) && \

    (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \

    __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) || \

    (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \

    __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9)

    #define DISPATCH_APPLY_AUTO_AVAILABLE 0

    #define DISPATCH_APPLY_QUEUE_ARG_NULLABILITY _Nonnull

    #else

    #define DISPATCH_APPLY_AUTO_AVAILABLE 1

    #define DISPATCH_APPLY_QUEUE_ARG_NULLABILITY _Nullable

    #endif

    /*@持续 DISPATCH_APPLY_AUTO

    *@摘要

    *传递给dispatch_apply() 或 dispatch_apply_f()的常量或请求

    *系统自动使用与配置匹配的工作线程

    *当前线程尽可能接近。

    *@讨论

    *提交块进行并行调用时,将此常量作为

    *queue参数将自动使用全局并发队列

    *与调用者的服务质量最为匹配。

    *不应假设哪个全局并发队列将

    *实际使用。

    *使用此常量可向后部署到macOS 10.9、iOS 7.0和任何tvOS或

    *watchOS版本。

    */

    #if DISPATCH_APPLY_AUTO_AVAILABLE

    #define DISPATCH_APPLY_AUTO ((dispatch_queue_t _Nonnull)0)

    #endif

    /*

    *@函数dispatch_apply

    *@摘要

    *将块提交到调度队列以进行并行调用。

    *@讨论

    *将块提交到调度队列以进行并行调用。此函数

    *等待任务块完成,然后返回。如果指定的队列

    *如果是并发的,则可以并发调用该块,因此必须

    *确保可重入安全。

    *块的每次调用都将传递当前迭代索引。

    *@参数迭代次数

    *要执行的迭代次数。

    *@参数队列

    *将块提交到的调度队列。

    *要传递的首选值是DISPATCH_APPLY_AUTO to automatically use

    *适用于调用线程的队列。

    *@参数块

    *要调用指定迭代次数的块。

    *此参数中传递NULL的结果未定义。

    *此函数用于执行输入块的Block_copy() 和 Block_release()

    *代表呼叫者。为了省去额外的块分配,

    *可以改用dispatch_apply_f。

    */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_apply(size_t iterations,

    dispatch_queue_t DISPATCH_APPLY_QUEUE_ARG_NULLABILITY queue,

    DISPATCH_NOESCAPE void (^block)(size_t iteration));

    #endif

    /*

    *@函数dispatch_apply_f

    *@摘要

    *将函数提交到调度队列以进行并行调用。

    *@讨论

    *有关详细信息,请参阅dispatch_apply() 。

    *@参数迭代次数

    *要执行的迭代次数。

    *@参数队列

    *函数提交到的调度队列。

    *要传递的首选值是DISPATCH_APPLY_AUTO to automatically use

    *适用于调用线程的队列。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在指定队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_apply_f()。传递给此函数的第二个参数是

    *迭代的当前索引。

    *此参数中传递NULL的结果未定义。

    */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL4 DISPATCH_NOTHROW

    void

    dispatch_apply_f(size_t iterations,

    dispatch_queue_t DISPATCH_APPLY_QUEUE_ARG_NULLABILITY queue,

    void *_Nullable context, void (*work)(void *_Nullable context, size_t iteration));

    /*

    *@函数dispatch_get_current_queue

    *@摘要

    *返回当前正在运行块的队列。

    *@讨论

    *返回当前正在运行块的队列。

    *已提交的块,它将返回默认的并发队列。

    *建议仅用于调试和记录目的:

    *代码不得对返回的队列进行任何假设,除非

    *是全局队列之一或代码本身创建的队列。

    *代码不能假定队列上的同步执行是安全的

    *如果该队列不是

    *dispatch_get_current_queue().。

    *在主线程上调用dispatch_get_current_queue()时,它可能

    *或可能返回的值与dispatch_get_main_queue(). 的值不同。比较

    *这两种方法不是测试代码是否在

    *主线程(请参阅dispatch_assert_queue()和dispatch_assert_queue_not())。

    *此函数已弃用,将在将来的版本中删除。

    *@结果

    *返回当前队列。

    */

    API 已弃用API_DEPRECATED("unsupported interface", macos(10.6,10.9), ios(4.0,6.0))

    DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW

    dispatch_queue_t

    dispatch_get_current_queue(void);

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT

    struct dispatch_queue_s _dispatch_main_q;

    /*

    函数dispatch_get_main_queue

    *@摘要

    *返回绑定到主线程的默认队列。

    *@讨论

    *为了调用提交到主队列的块,应用程序必须

    *调用dispatch_main()、NSApplicationMain(),或在main上使用CFRunLoop

    *螺纹。

    *主队列用于在应用程序上下文中与

    *主线程和主运行循环。

    *因为主队列的行为不完全像常规的串行队列,

    *在非UI应用程序的流程中使用时,可能会产生不必要的副作用

    *(守护进程)。对于此类进程,应避免使用主队列。

    *@请参阅dispatch_queue_main\t

    *@结果

    *返回主队列。此队列是代表自动创建的

    *调用main()之前的主线程。

    */

    DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_CONST DISPATCH_NOTHROW

    dispatch_queue_main_t

    dispatch_get_main_queue(void)

    {

    return DISPATCH_GLOBAL_OBJECT(dispatch_queue_main_t, _dispatch_main_q);

    }

    /*

    typedef dispatch_queue_priority_t

    *dispatch_queue_priority的类型

    *@常量DISPATCH_QUEUE_PRIORITY_HIGH

    *调度到队列的项目将以高优先级运行,

    *即队列将在

    *任何默认优先级或低优先级队列。

    *@constant DISPATCH_QUEUE_PRIORITY\u默认值

    *调度到队列的项目将在默认情况下运行

    *优先级,即队列将被安排执行

    *在调度了所有高优先级队列之后,但是

    *在计划任何低优先级队列之前。

    *@常量DISPATCH_QUEUE_PRIORITY_LOW

    *调度到队列的项目将以低优先级运行,

    *也就是说,队列最终将被安排执行

    *默认优先级和高优先级队列

    *已计划。

    *@常量DISPATCH_QUEUE_PRIORITY_BACKGROUND

    *调度到队列的项目将以后台优先级运行,即队列

    *将安排在所有高优先级队列完成后执行

    *已计划,系统将在具有

    *符合setpriority(2)的后台状态(即磁盘i/O被限制,并且

    *线程的调度优先级设置为最低值)。

    */

    #define DISPATCH_QUEUE_PRIORITY_HIGH 2

    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)

    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

    typedef long dispatch_queue_priority_t;

    /*

    函数dispatch_get_global_queue

    *@摘要

    *返回给定服务质量的已知全局并发队列

    *类别。

    *@讨论

    *请参阅 dispatch_queue_global_t.

    *@参数标识符

    *qos_class_t 中定义的服务质量类别或中定义的优先级

    *dispatch_queue_priority_t.

    *建议使用服务质量等级值来确定

    *著名的全局并发队列:

     *  - QOS_CLASS_USER_INTERACTIVE

     *  - QOS_CLASS_USER_INITIATED

     *  - QOS_CLASS_DEFAULT

     *  - QOS_CLASS_UTILITY

     *  - QOS_CLASS_BACKGROUND

    *全局并发队列仍然可以通过其优先级来识别,

    *映射到以下QOS类:

     *  - DISPATCH_QUEUE_PRIORITY_HIGH:        QOS_CLASS_USER_INITIATED

     *  - DISPATCH_QUEUE_PRIORITY_DEFAULT:      QOS_CLASS_DEFAULT

     *  - DISPATCH_QUEUE_PRIORITY_LOW:          QOS_CLASS_UTILITY

     *  - DISPATCH_QUEUE_PRIORITY_BACKGROUND:  QOS_CLASS_BACKGROUND

    *@参数标志

    *保留供将来使用。传递除零以外的任何值可能会导致

    *空返回值。

    *@结果

    *返回请求的全局队列,如果请求的全局队列

    *不存在。

    */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW

    dispatch_queue_global_t

    dispatch_get_global_queue(intptr_t identifier, uintptr_t flags);

    /*

    typedef dispatch_queue_attr_t

    *@摘要

    *调度队列的属性。

    */

    DISPATCH_DECL(dispatch_queue_attr);

    /*

    const DISPATCH_QUEUE_SERIAL

    *@讨论

    *可用于创建调用块的调度队列的属性

    *按FIFO顺序串行。

    *请参阅dispatch_queue_serial_t.

    */

    #define DISPATCH_QUEUE_SERIAL NULL

    /*

    const DISPATCH_QUEUE_SERIAL_INACTIVE

    *@讨论

    *可用于创建调用块的调度队列的属性

    *按FIFO顺序串行,并且最初处于非活动状态。

    *请参阅dispatch_queue_attr_make_initially_inactive().

    */

    #define DISPATCH_QUEUE_SERIAL_INACTIVE \

    dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_SERIAL)

    /*

    const DISPATCH_QUEUE_CONCURRENT (并发)

    *@讨论

    *可用于创建可调用的调度队列的属性

    *同时阻塞,并支持随调度提交的屏障阻塞

    *屏障API。

    *请参阅dispatch_queue_concurrent_t。

    */

    #define DISPATCH_QUEUE_CONCURRENT \

    DISPATCH_GLOBAL_OBJECT(dispatch_queue_attr_t, \

    _dispatch_queue_attr_concurrent)

    API_AVAILABLE(macos(10.7), ios(4.3))

    DISPATCH_EXPORT

    struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent;

    /*

    const DISPATCH_QUEUE_CONCURRENT_INACTIVE (未激活)

    *@讨论

    *可用于创建可调用的调度队列的属性

    *同时阻塞,并支持随调度提交的屏障阻塞

    *barrier API,并且该API最初处于非活动状态。

    *请参阅dispatch_queue_attr_make_initially_inactive().

    */

    #define DISPATCH_QUEUE_CONCURRENT_INACTIVE \

    dispatch_queue_attr_make_initially_inactive(DISPATCH_QUEUE_CONCURRENT)

    /*

    函数dispatch_queue_attr_make_initially_inactive

    *@摘要

    *返回可提供给dispatch_queue_create())的属性值

    *或dispatch_queue_create_with_target(),以使创建的队列

    *最初处于非活动状态。

    *@讨论

    *调度队列可以在非活动状态下创建。处于此状态的队列

    *必须在调用与之关联的任何块之前激活。

    *无法释放处于非活动状态的队列,dispatch_activate()必须为

    *在最后一次引用使用此属性创建的队列之前调用

    *已发布。

    *处于非活动状态的队列的目标队列可以使用

    *dispatch_set_target_queue()。不再允许更改目标队列

    *一旦初始非活动队列被激活。

    *@参数属性

    *要与初始非活动属性组合的队列属性值。

    *@返回

    *返回可提供给dispatch_queue_create()的属性值

    *和dispatch_queue_create_with_target()。

    *新值将“attr”参数指定的属性与

    *初始非活动属性。

    */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW

    dispatch_queue_attr_t

    dispatch_queue_attr_make_initially_inactive(

    dispatch_queue_attr_t_Nullableattr);

    /*!

     *@const DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL

     *@讨论

    *使用此属性创建的调度队列在FIFO中串行调用块

    *顺序,并围绕异步提交给它的任何块的执行

    *相当于一个单独的目标-C

    *范围。

    *请参见 dispatch_queue_attr_make_with_autorelease_frequency().

     */

    #define DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL \

    dispatch_queue_attr_make_with_autorelease_frequency(\

    DISPATCH_QUEUE_SERIAL, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM)

    /*!

     *@const DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL

     *@讨论

    *使用此属性创建的调度队列在FIFO中串行调用块

    *顺序,并围绕异步提交给它的任何块的执行

    *相当于一个单独的目标-C

    *范围。

    *请参见 dispatch_queue_attr_make_with_autorelease_frequency().

     */

    #define DISPATCH_QUEUE_CONCURRENT_WITH_AUTORELEASE_POOL \

    dispatch_queue_attr_make_with_autorelease_frequency(\

    DISPATCH_QUEUE_CONCURRENT, DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM)

    /*!

     *@typedef dispatch_autorelease_frequency_t

     * Values to pass to the dispatch_queue_attr_make_with_autorelease_frequency()

    *功能。

      *@const DISPATCH_AUTORELEASE_FREQUENCY_INHERIT

    *具有此自动释放频率的调度队列继承

    *他们的目标队列。这是手动创建队列的默认行为。

      *@const DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM

    *具有此自动释放频率的调度队列推送并弹出自动释放

    *围绕提交给它的每个块的执行进行聚合

    *异步。

    *@参见 dispatch_queue_attr_make_with_autorelease_frequency().

      *@const DISPATCH_AUTORELEASE_FREQUENCY_NEVER

    *具有此自动释放频率的调度队列从不设置个人

    *自动释放提交给它的块的执行周围的池

    *异步。这是全局并发队列的行为。

     */

    DISPATCH_ENUM(dispatch_autorelease_frequency,unsignedlong,

    DISPATCH_AUTORELEASE_FREQUENCY_INHERIT DISPATCH_ENUM_API_AVAILABLE(

    macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 0,

    DISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM DISPATCH_ENUM_API_AVAILABLE(

    macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 1,

    DISPATCH_AUTORELEASE_FREQUENCY_NEVER DISPATCH_ENUM_API_AVAILABLE(

    macos(10.12), ios(10.0), tvos(10.0), watchos(3.0)) = 2,

    );

    /*!

     *@作用 dispatch_queue_attr_make_with_autorelease_frequency

     *@摘要

    *返回具有自动释放频率的调度队列属性值

    *设置为指定值。

    *@讨论

    *队列使用每工作项自动释放频率时(直接

    *或从其目标队列继承),异步提交给

    *此队列(通过dispatch_async()、dispatch_barrier_async(),

    *dispatch_group_notify()等…)就像被一个人包围一样执行

    *目标-C自动释放池范围。

    *自动释放频率对提交的块没有影响

    *同步到队列(通过dispatch_sync()、dispatch_barrier_sync())。

    *全局并发队列具有DISPATCH_AUTORELEASE_FREQUENCY_NEVER

    *行为。手动创建的调度队列使用

    *默认情况下,DISPATCH_AUTORELEASE_FREQUENCY_INHERIT。

    *使用此属性创建的队列在

    *已激活。请参阅dispatch_set_target_queue()和dispatch_activate()。

    *@参数属性

    *要与指定的自动释放组合的队列属性值

    *频率或空值。

    *@参数频率

    *请求的自动释放频率。

    *@返回

    *返回可提供给dispatch_queue_create()的属性值

    *如果请求的自动释放频率无效,则为NULL。

    *此新值将“attr”参数指定的属性与

    *选择的自动释放频率。

     */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW

    dispatch_queue_attr_t

    dispatch_queue_attr_make_with_autorelease_frequency(

    dispatch_queue_attr_t_Nullableattr,

    dispatch_autorelease_frequency_t frequency);

    /*

    数 dispatch_queue_attr_make_with_qos_class

    *@摘要

    *返回可提供给dispatch_queue_create()的属性值

    *或dispatch_queue_create_with_target(),以分配QOS类和

    *队列的相对优先级。

    *@讨论

    *当以这种方式指定时,QOS类和相对优先级将

    *优先于从调度队列的目标队列继承的优先级(如果

    *任何)只要不会导致较低的QOS级别和相对优先级。

    *全局队列优先级映射到以下QOS类:

    *-DISPATCH_QUEUE_PRIORITY_HIGH:QOS_CLASS_USER_INITIATED

    *-DISPATCH_QUEUE_PRIORITY_DEFAULT:QOS_CLASS_DEFAULT

    *-DISPATCH_QUEUE_PRIORITY_LOW:QOS_CLASS\u实用程序

    *-DISPATCH_QUEUE_PRIORITY_BACKGROUND:QOS_CLASS_BACKGROUND

    *示例:

    *<代码>

    *dispatch_queue_t queue;

    *dispatch_queue_attr_t attr;

    *attr=dispatch_queue_attr_make_with_qos_class(dispatch_queue_SERIAL,

    *QOS_CLASS\u实用程序,0);

    *queue=dispatch_queue_create(“com.example.myqueue”,attr);

    *</代码>

    *以这种方式在队列上设置的QOS类和相对优先级对

    *同步提交到队列的块(通过dispatch_sync(),

    *dispatch_barrier_sync())。

    *@参数属性

    *要与QOS类组合的队列属性值,或NULL。

    *@参数qos\u类

    *QOS类值:

    *-QOS_CLASS_USER_INTERACTIVE

    *-QOS_CLASS_USER\u已启动

    *-QOS_CLASS\u默认值

    *-QOS_CLASS\u实用程序

    *-QOS_CLASS\u后台

    *传递任何其他值都会导致返回NULL。

    *@参数相对优先级

    *QOS类中的相对优先级。此值为负值

    *给定类支持的最大调度程序优先级的偏移量。

    *传递大于零或小于QOS_MIN_RELATIVE_PRIORITY的值

    *结果返回NULL。

    *@返回

    *返回可提供给dispatch_queue_create()的属性值

    *和dispatch_queue_create_with_target(),如果使用了无效的QOS类,则为NULL

    *已请求。

    *新值将“attr”参数指定的属性与

    *新的QOS类别和相对优先级。

    */

    API_AVAILABLE(macos(10.10), ios(8.0))

    DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_PURE DISPATCH_NOTHROW

    dispatch_queue_attr_t

    dispatch_queue_attr_make_with_qos_class(dispatch_queue_attr_t_Nullableattr,

    dispatch_qos_class_t qos_class,intrelative_priority);

    /*!

     *@const DISPATCH_TARGET_QUEUE_DEFAULT

    *@要传递给dispatch_queue_create_with_target()的讨论常量,

    *dispatch_set_target_queue()和dispatch_source_create()函数

    *指示相关对象类型的默认目标队列

    *应使用。

     */

    #define DISPATCH_TARGET_QUEUE_DEFAULT NULL

    /*!

    *@函数dispatch_queue_create_with_target

    *@摘要

    *使用指定的目标队列创建新的调度队列。

    *@讨论

    *使用Dispatch_QUEUE_SERIAL或NULL属性创建的调度队列

    *按FIFO顺序串行调用块。

    *使用Dispatch_QUEUE_CONCURRENT属性创建的调度队列可能

    *并发调用块(类似于全局并发队列,但

    *可能会有更多开销),并支持提交的屏障块

    *dispatch barrier API,可实现高效的

    *读写器方案。

    *当不再需要调度队列时,应使用

    *dispatch_release()。请注意,任何以异步方式提交到的挂起块

    *队列将包含对该队列的引用。因此,队列不会

    *解除分配,直到所有挂起的块完成。

    *使用调度队列属性@属性指定QoS类时(派生

    *根据dispatch_queue_attr_make_with_qos_class())的结果,传递

    *@a target中dispatch_get_global_queue()的结果将忽略QoS类

    *并将使用具有QoS类的全局队列

    *由attr指定。

    *使用dispatch_queue_create_with_target()创建的队列不能具有

    *目标队列已更改,除非创建为非活动队列(请参阅

    *dispatch_queue_attr_make_initially_inactive()),在这种情况下,目标

    *可以更改队列,直到用激活新创建的队列

    *dispatch_activate()。

    *@参数标签

    *要附加到队列的字符串标签。

    *此参数是可选的,可以为NULL。

    *@参数属性

    *预定义属性,如DISPATCH_QUEUE_SERIAL,

    *DISPATCH_QUEUE_CONCURRENT,或调用的结果

    *一个dispatch_queue_attr_make\u,带有\*函数。

    *@参数目标

    *新创建队列的目标队列。将保留目标队列。

    *如果此参数为DISPATCH_TARGET_QUEUE_DEFAULT,则设置队列的目标

    *队列到给定队列类型的默认目标队列。

    *@结果

    *新创建的调度队列。

    */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT

    DISPATCH_NOTHROW

    dispatch_queue_t

    dispatch_queue_create_with_target(constchar*_Nullablelabel,

    dispatch_queue_attr_t_Nullableattr, dispatch_queue_t_Nullabletarget)

    DISPATCH_ALIAS_V2(dispatch_queue_create_with_target);

    /*!

     *@函数dispatch_queue_create

    *@摘要

    *创建一个新的调度队列,可以将块提交到该队列。

    *@讨论

    *使用Dispatch_QUEUE_SERIAL或NULL属性创建的调度队列

    *按FIFO顺序串行调用块。

    *使用Dispatch_QUEUE_CONCURRENT属性创建的调度队列可能

    *并发调用块(类似于全局并发队列,但

    *可能会有更多开销),并支持提交的屏障块

    *dispatch barrier API,可实现高效的

    *读写器方案。

    *当不再需要调度队列时,应使用

    *dispatch_release()。请注意,任何以异步方式提交到的挂起块

    *队列将包含对该队列的引用。因此,队列不会

    *解除分配,直到所有挂起的块完成。

    *使用_qos_class()函数传递dispatch_queue_attr_make\u的结果

    *此函数的attr参数允许服务质量类和

    *要为新创建的队列指定的相对优先级。

    *规定的服务质量等级优先于质量等级

    *新创建的调度队列的目标队列的服务类(如果有)

    *只要这不会导致较低的QOS级别和相对优先级。

    *如果未指定服务质量类,则

    *创建的调度队列是默认优先级全局并发队列。

    *@参数标签

    *要附加到队列的字符串标签。

    *此参数是可选的,可以为NULL。

    *@参数属性

    *预定义属性,如DISPATCH_QUEUE_SERIAL,

    *DISPATCH_QUEUE_CONCURRENT,或调用的结果

    *一个dispatch_queue_attr_make\u,带有\*函数。

    *@结果

    *新创建的调度队列。

    */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT

    DISPATCH_NOTHROW

    dispatch_queue_t

    dispatch_queue_create(constchar*_Nullablelabel,

    dispatch_queue_attr_t_Nullableattr);

    /*!

     *@const DISPATCH_CURRENT_QUEUE\u标签

    *@要传递给dispatch_queue_get_label()函数的讨论常量

    *检索当前队列的标签。

    */

    #define DISPATCH_CURRENT_QUEUE_LABEL NULL

    /*!

     *@函数dispatch_queue_get_label

    *@摘要

    *返回给定队列的标签,如创建队列时指定的

    *如果指定了空标签,则为空字符串。

    *传递DISPATCH_CURRENT_QUEUE_LABEL将返回当前

    *队列。

    *@参数队列

    *要查询的队列,或DISPATCH_CURRENT_queue\u标签。

    *@结果

    *队列的标签。

     */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW

    constchardispatch_queue_get_label(dispatch_queue_t_Nullablequeue);

    /*!

    *@函数dispatch_queue_get_qos\u类

    *@摘要

    *返回给定队列的QOS类和相对优先级。

    *@讨论

    *如果给定队列是使用返回的属性值创建的

    *dispatch_queue_attr_make_with_qos_class(),此函数返回qos

    *当时规定的等级和相对优先级;对于任何其他属性

    *值它返回一个QOS_class\u未指定的QOS类和一个相对

    *优先级为0。

    *如果给定队列是全局队列之一,则此函数将返回其

    *根据dispatch_get_global_queue()和

    *相对优先级为0;对于主队列,它返回QOS

    *qos_class_main()提供的值,相对优先级为0。

    *@参数队列

    *要查询的队列。

    *@参数relative_priority_ptr

    *指向要用相对优先级偏移量填充的int变量的指针

    *在QOS类中,或为NULL。

    *@返回

    *QOS类值:

    *-QOS_CLASS_USER_INTERACTIVE

    *-QOS_CLASS_USER\u已启动

    *-QOS_CLASS\u默认值

    *-QOS_CLASS\u实用程序

    *-QOS_CLASS\u后台

    *-QOS_CLASS\u未指定

    */

    API_AVAILABLE(macos(10.10), ios(8.0))

    DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_NONNULL1 DISPATCH_NOTHROW

    dispatch_qos_class_t

    dispatch_queue_get_qos_class(dispatch_queue_t queue,

    int*_Nullablerelative_priority_ptr);

    /*!

    *@函数dispatch_set_target_queue

    *@摘要

    *设置给定对象的目标队列。

    *@讨论

    *对象的目标队列负责处理该对象。

    *当没有为指定服务质量等级和相对优先级时

    *调度队列创建时,调度队列的服务质量

    *类从其目标队列继承。dispatch_get_global_queue()

    *函数可用于获取特定质量的目标队列

    *服务类,但是使用dispatch_queue_attr_make_with_qos_class()

    *建议改为。

    *提交到目标队列为另一个串行队列的串行队列的块

    *队列不会与提交给目标的块同时调用

    *队列或具有相同目标队列的任何其他队列。

    *将循环引入目标队列层次结构的结果是

    *未定义。

    *调度源的目标队列指定其事件处理程序和

    *将提交取消处理程序块。

    *调度I/O通道的目标队列指定其I/O的位置

    *执行操作。如果通道的目标队列的优先级设置为

    *DISPATCH_QUEUE_PRIORITY_BACKGROUND,然后由执行的I/O操作

    *该队列上的dispatch_io_read()或dispatch_io_write()将

    *存在I/O争用时已阻止。

    *对于所有其他调度对象类型,目标队列的唯一功能

    *用于确定在何处调用对象的终结器函数。

    *通常,更改对象的目标队列是异步的

    *不会立即生效且不会影响块的操作

    *已与指定对象关联。

    *但是,如果在dispatch_set_target_queue()为

    *调用,则目标队列更改立即生效,并将

    *影响已与指定对象关联的块。在

    *初始非活动对象已激活,调用

    *dispatch_set_target_queue()导致一个断言,进程

    *终止。

    *如果调度队列处于活动状态,并且是其他调度对象的目标,

    *更改其目标队列会导致未定义的行为。

    *@参数对象

    *要修改的对象。

    *此参数中传递NULL的结果未定义。

    *@参数队列

    *对象的新目标队列。队列将保留,并且

    *释放上一个目标队列(如果有)。

    *如果queue是DISPATCH_TARGET_queue_DEFAULT,则设置对象的目标队列

    *到给定对象类型的默认目标队列。

    */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NOTHROW

    void

    dispatch_set_target_queue(dispatch_object_t object,

    dispatch_queue_t_Nullablequeue);

    /*!

     *函数 dispatch_main

     *@摘要

    *执行提交到主队列的块。

    *@讨论

    *此函数“停止”主线程并等待提交块

    *到主队列。此函数永远不会返回。

    *在上调用NSApplicationMain()或CFRunLoopRun()的应用程序

    *主线程不需要调用dispatch_main()。

    */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NOTHROW DISPATCH_NORETURN

    void

    dispatch_main(void);

    /*!

    *函数 dispatch_after

    *@摘要

    *计划在指定时间在给定队列上执行块。

    *@讨论

    *支持将DISPATCH_TIME_NOW作为“when”参数传递,但不作为

    *改为调用dispatch_async()是最佳的。永远通过DISPATCH_TIME\u

    *未定义。

    *@参数何时

    *dispatch_time()或dispatch_walltime()返回的时间里程碑。

    *@参数队列

    *给定块将在指定时间提交到的队列。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要执行的代码块。

    *此参数中传递NULL的结果未定义。

     */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_after(dispatch_time_t when, dispatch_queue_t queue,

    dispatch_block_t block);

    #endif

    /*!

     *函数 dispatch_after_f

     *@摘要

    *安排函数在指定时间在给定队列上执行。

    *@讨论

    *有关详细信息,请参阅dispatch_after()。

    *@参数何时

    *dispatch_time()或dispatch_walltime()返回的时间里程碑。

    *@参数队列

    *给定函数将在指定时间提交到的队列。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_after_f().。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.6), ios(4.0))

    DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NONNULL4 DISPATCH_NOTHROW

    void

    dispatch_after_f(dispatch_time_t when, dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t work);

    /*!

    *函数group Dispatch Barrier API

    *dispatch barrier API是一种将屏障块提交给

    *调度队列,类似于dispatch_async()/dispatch_sync()API。

    *它可以实现高效的读写器方案。

    *屏障块仅在提交到使用

    *DISPATCH_QUEUE_CONCURRENT属性;在这样的队列上,障碍块

    *在之前提交到队列的所有块完成之前,不会运行,

    *并且在屏障块之后提交到队列的任何块都不会运行

    *直到隔离块完成。

    *提交到全局队列或未使用创建的队列时

    *DISPATCH_QUEUE_CONCURRENT属性,屏障块的行为与

    *使用dispatch_async()/dispatch_sync()API提交的块。

     */

    /*!

     *函数 dispatch_barrier_async

     *@摘要

    *提交屏障块以在调度队列上异步执行。

    *@讨论

    *将块提交到dispatch_async()之类的调度队列,但标记为

    *阻止为屏障(仅与DISPATCH_QUEUE\u并发队列相关)。

    *有关详细信息,请参阅dispatch_async(),有关说明,请参阅“dispatch Barrier API”

    *障碍语义。

    *@参数队列

    *将块提交到的目标调度队列。

    *系统将在目标队列上保留引用,直到阻塞

    *已完成。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要提交到目标调度队列的块。此函数执行

    *代表调用方执行Block_copy()和Block_release()。

    *此参数中传递NULL的结果未定义。

     */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.7), ios(4.3))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

    #endif

    /*!

     *函数 dispatch_barrier_async_f

     *@摘要

    *提交barrier函数以在调度队列上异步执行。

    *@讨论

    *将函数提交到调度队列,如dispatch_async_f(),但标记

    *作为屏障的功能(仅在DISPATCH_QUEUE_CONCURRENT上相关

    *队列)。

    *有关详细信息,请参阅dispatch_async_f(),有关

    *障碍语义的描述。

    *@参数队列

    *将函数提交到的目标调度队列。

    *系统将在目标队列上保留引用,直到函数

    *已返回。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_barrier_async_f()。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.7), ios(4.3))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_barrier_async_f(dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t work);

    /*!

     *函数 dispatch_barrier_sync

     *@摘要

    *提交屏障块以在调度队列上同步执行。

    *@讨论

    *将块提交到dispatch_sync()之类的调度队列,但标记为

    *阻止为屏障(仅与DISPATCH_QUEUE\u并发队列相关)。

    *有关详细信息,请参阅dispatch_sync(),有关说明,请参阅“dispatch Barrier API”

    *障碍语义。

    *@参数队列

    *将块提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数块

    *要在目标调度队列上调用的块。

    *此参数中传递NULL的结果未定义。

     */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.7), ios(4.3))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_barrier_sync(dispatch_queue_t queue,

    DISPATCH_NOESCAPE dispatch_block_t block);

    #endif

    /*!

     *函数 dispatch_barrier_sync_f

      *@摘要

    *提交屏障函数,以便在调度队列上同步执行。

    *@讨论

    *将函数提交到dispatch_sync_f()之类的调度队列,但标记为

    *作为屏障的功能(仅与DISPATCH_QUEUE\u并发队列相关)。

    *有关详细信息,请参阅dispatch_sync_f()。

    *@参数队列

    *将函数提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_barrier_sync_f()。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.7), ios(4.3))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_barrier_sync_f(dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t work);

    /*!

     *函数 dispatch_barrier_async_and_wait

     *@摘要

    *提交块以在调度队列上同步执行。

    *@讨论

    *将块提交到dispatch_async\u和_wait()等调度队列,但标记

    *该块作为屏障(仅与DISPATCH_QUEUE_CONCURRENT相关

    *队列)。

    *有关屏障语义的描述,请参阅“Dispatch Barrier API”。

    *@参数队列

    *将块提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数工时

    *要在目标队列上调用的应用程序定义的块。

    *此参数中传递NULL的结果未定义。

     */

    #ifdef __BLOCKS__

    API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW

    void

    dispatch_barrier_async_and_wait(dispatch_queue_t queue,

    DISPATCH_NOESCAPE dispatch_block_t block);

    #endif

    /*!

     *函数 dispatch_barrier_async_and_wait_f

     *@摘要

    *提交用于在调度队列上同步执行的函数。

    *@讨论

    *将函数提交到调度队列,如dispatch_async\u和_wait_f(),但

    *将其标记为屏障仅与dispatch_async_and_wait_f(), but

     * marks that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT

     * queues).

    *有关屏障语义的描述,请参阅“Dispatch Barrier API”。

    *@参数队列

    *将函数提交到的目标调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数上下文

    *要传递给函数的应用程序定义的上下文参数。

    *@参数工时

    *要在目标队列上调用的应用程序定义的函数。第一个

    *传递给此函数的参数是提供给的上下文

    *dispatch_barrier_async_and_wait_f()。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.14), ios(12.0), tvos(12.0), watchos(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NONNULL3 DISPATCH_NOTHROW

    void

    dispatch_barrier_async_and_wait_f(dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t work);

    /*!

     *@功能 组Dispatch queue-specific contexts

    *此API允许不同的子系统将上下文关联到共享队列

    *无冲突风险,并从执行的块中检索上下文

    *在目标队列层次结构中的该队列或其任何子队列上。

     */

    /*!

     *函数 dispatch_queue_set_specific

     *@摘要

    *将子系统特定上下文与密钥的调度队列相关联

    *子系统独有。

    *@讨论

    *指定的析构函数将在默认

    *优先级全局并发队列为同一密钥设置新上下文时,

    *或者在释放对队列的所有引用之后。

    *@参数队列

    *要修改的调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数键

    *设置上下文的键,通常是指向静态变量的指针

    *特定于子系统。键仅作为指针进行比较,从不进行比较

    *取消引用。不建议直接传递字符串常量。

    *空键是保留的,为其设置上下文的尝试将被忽略。

    *@参数上下文

    *对象的新子系统特定上下文。这可能为空。

    *@参数析构函数

    *析构函数指针。这可能为NULL,如果上下文

    *为空。

     */

    API_AVAILABLE(macos(10.7), ios(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_NOTHROW

    void

    dispatch_queue_set_specific(dispatch_queue_t queue,constvoid*key,

    void*_Nullablecontext, dispatch_function_t_Nullabledestructor);

    /*!

     *函数 dispatch_queue_get_specific

     *@摘要

    *返回与调度队列关联的子系统特定上下文,用于

    *子系统特有的密钥。

    *@讨论

    *如果指定键已在指定的

    *队列。

    *@参数队列

    *要查询的调度队列。

    *此参数中传递NULL的结果未定义。

    *@参数键

    *获取上下文的键,通常是指向静态变量的指针

    *特定于子系统。键仅作为指针进行比较,从不进行比较

    *取消引用。不建议直接传递字符串常量。

    *@结果

    *指定键的上下文,如果找不到上下文,则为NULL。

     */

    API_AVAILABLE(macos(10.7), ios(5.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1 DISPATCH_PURE DISPATCH_WARN_RESULT

    DISPATCH_NOTHROW

    void*_Nullable

    dispatch_queue_get_specific(dispatch_queue_t queue,constvoid*key);

    /*!

     *函数 dispatch_get_specific

     *@摘要

    *返回的唯一键的当前子系统特定上下文

    *子系统。

    *@讨论

    *从队列上执行的块调用时,返回

    *如果已在队列上设置了指定键,则返回结果

    *在队列的目标队列上执行的dispatch_get_specific()的个数或NULL

    *如果当前队列是全局并发队列。

    *@参数键

    *获取上下文的键,通常是指向静态变量的指针

    *特定于子系统。键仅作为指针进行比较,从不进行比较

    *取消引用。不建议直接传递字符串常量。

    *@结果

    *指定键的上下文,如果找不到上下文,则为NULL。

     */

    API_AVAILABLE(macos(10.7), ios(5.0))

    DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NOTHROW

    void*_Nullable

    dispatch_get_specific(constvoid*key);

    /*!

     *函数group Dispatch assertion API

     *此API在运行时断言代码正在上下文中(或在上下文外)执行

    *给定队列的。它可用于检查访问资源的块

    *从保护资源的适当队列执行此操作。也可以使用

    *验证在给定队列上运行时可能导致死锁的块

    *从不在该队列上执行。

     */

    /*!

     *函数 dispatch_assert_queue

     *@摘要

    *验证当前块是否正在给定调度队列上执行。

    *@讨论

    *某些代码需要在特定的调度队列上运行。此函数

    *验证该期望是否为真。

    *如果当前执行的块已提交到指定队列或

    *任何以其为目标的队列(请参阅dispatch_set_target_queue()),此函数

    *返回。

    *如果当前执行的块是使用同步API提交的

    *(dispatch_sync(),dispatch_barrier_sync(),…),的上下文

    *还将计算提交块(递归)。

    *如果发现同步提交块本身已提交到

    *此函数返回指定的队列或指向该队列的任何队列。

    *否则,此函数断言:它将向系统日志记录解释,并

    *终止应用程序。

    *将dispatch_get_main_queue()的结果传递到此函数可验证

    *当前块已提交到主队列或队列

    *以它为目标,或在主线程上运行(在任何上下文中)。

    *在

    *提交的块(例如,来自手动创建的线程的上下文

    *使用pthread_create()),则此函数也将断言和终止

    *应用程序。

    *变量dispatch_assert_queue_debug()在

    *定义了预处理器宏NDEBUG。(另见断言(3))。

    *@参数队列

    *当前块预期在其上运行的调度队列。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1

    void

    dispatch_assert_queue(dispatch_queue_t queue)

    DISPATCH_ALIAS_V2(dispatch_assert_queue);

    /*!

     *函数 dispatch_assert_queue_barrier

     *@摘要

    *验证当前块是否正在给定调度队列上执行,

    *并且该块在该队列上充当屏障。

    *@讨论

    *这与dispatch_assert_queue()的行为完全相同,并进行了额外的检查

    *当前块在指定队列上充当屏障,即

    *如果指定队列为串行队列,则始终为true(请参阅DISPATCH_BLOCK_BARRIER或

    *dispatch_barrier_async()获取详细信息)。

    *变量dispatch_assert_queue_barrier_debug()在

    *定义了预处理器宏NDEBUG。(另请参见assert())。

    *@参数队列

    *当前块预期作为屏障运行的调度队列。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1

    void

    dispatch_assert_queue_barrier(dispatch_queue_t queue);

    /*!

     *函数 dispatch_assert_queue_not

    *@摘要

    *验证当前块是否未在给定的调度队列上执行。

    *@讨论

    *此函数等效于dispatch_assert_queue(),用于测试

    *相等反转。这意味着它将在以下情况下终止应用程序

    *dispatch_assert_queue()将返回,反之亦然。请参见此处的讨论。

    *变量dispatch_assert_queue_not_debug()在

    *定义了预处理器宏NDEBUG。(另见断言(3))。

    *@参数队列

    *当前块预期不会在其上运行的调度队列。

    *此参数中传递NULL的结果未定义。

     */

    API_AVAILABLE(macos(10.12), ios(10.0), tvos(10.0), watchos(3.0))

    DISPATCH_EXPORT DISPATCH_NONNULL1

    void

    dispatch_assert_queue_not(dispatch_queue_t queue)

    DISPATCH_ALIAS_V2(dispatch_assert_queue_not);

    #ifdef NDEBUG

    #define dispatch_assert_queue_debug(q) ((void)(0 && (q)))

    #define dispatch_assert_queue_barrier_debug(q) ((void)(0 && (q)))

    #define dispatch_assert_queue_not_debug(q) ((void)(0 && (q)))

    #else

    #define dispatch_assert_queue_debug(q) dispatch_assert_queue(q)

    #define dispatch_assert_queue_barrier_debug(q) dispatch_assert_queue_barrier(q)

    #define dispatch_assert_queue_not_debug(q) dispatch_assert_queue_not(q)

    #endif

    __END_DECLS

    DISPATCH_ASSUME_NONNULL_END

    #endif

    相关文章

      网友评论

          本文标题:GCD官方文档翻译整理

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