简述GCD有哪些方法 api ?
参考答案:
GCD(Grand Central Dispatch)是Apple提供的一套多线程编程的解决方案。它提供了一套强大的API,用于在应用程序中创建、管理和调度任务。以下是GCD中常用的一些方法和API:
-
创建队列:
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
: 创建一个新的dispatch队列。label是队列的标签,用于调试;attr决定了队列的类型,如串行或并行。
-
异步执行:
dispatch_async(dispatch_queue_t queue, dispatch_block_t block)
: 将block异步提交到指定的队列中执行。
-
同步执行:
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block)
: 将block同步提交到指定的队列中执行。调用此方法的线程会等待block执行完成才继续执行后续代码。
-
一次性执行:
dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
: 确保block只被执行一次,即使多次调用dispatch_once
。
-
延迟执行:
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block)
: 在指定的时间后,将block提交到指定的队列中执行。
-
队列组:
dispatch_group_create()
: 创建一个新的dispatch组。dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
: 将block异步提交到队列中,并添加到组中。dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
: 当组中所有任务都完成时,执行指定的block。
-
信号量:
dispatch_semaphore_create(long value)
: 创建一个信号量,并设置其初始值。dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout)
: 等待信号量可用。dispatch_semaphore_signal(dispatch_semaphore_t dsema)
: 增加信号量的计数。
-
主队列:
dispatch_get_main_queue()
: 获取与主线程相关联的队列。通常用于在主线程上执行UI更新等操作。
-
全局队列:
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags)
: 获取全局并发队列。
-
队列优先级:
- GCD提供了不同的队列优先级,如
DISPATCH_QUEUE_PRIORITY_DEFAULT
、DISPATCH_QUEUE_PRIORITY_HIGH
、DISPATCH_QUEUE_PRIORITY_LOW
、DISPATCH_QUEUE_PRIORITY_BACKGROUND
等。
- GCD提供了不同的队列优先级,如
此外,GCD还提供了一些其他API和功能,如设置自定义队列的优先级、队列的暂停与重启、栅栏操作等。
使用GCD时,开发者应充分利用其异步执行和并发处理的能力,同时避免死锁、竞争条件等线程安全问题。在实际开发中,根据任务的性质和需求,选择适当的队列类型和优先级,以及合理地组合使用不同的API,以实现高效且安全的并发编程。