推荐答案
// www.javascriptcn.com code example
import Foundation
// 创建一个串行队列
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
// 创建一个并发队列
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// 在主队列中异步执行任务
DispatchQueue.main.async {
print("This is running on the main queue")
}
// 在串行队列中异步执行任务
serialQueue.async {
print("This is running on a serial queue")
}
// 在并发队列中异步执行任务
concurrentQueue.async {
print("This is running on a concurrent queue")
}
// 使用DispatchGroup来管理一组任务
let group = DispatchGroup()
group.enter()
concurrentQueue.async {
print("Task 1 started")
sleep(2)
print("Task 1 finished")
group.leave()
}
group.enter()
concurrentQueue.async {
print("Task 2 started")
sleep(1)
print("Task 2 finished")
group.leave()
}
group.notify(queue: .main) {
print("All tasks are finished")
}
// 使用DispatchWorkItem来封装任务
let workItem = DispatchWorkItem {
print("This is a work item")
}
// 执行workItem
concurrentQueue.async(execute: workItem)
// 使用DispatchSemaphore来控制并发
let semaphore = DispatchSemaphore(value: 2)
concurrentQueue.async {
semaphore.wait()
print("Task A started")
sleep(1)
print("Task A finished")
semaphore.signal()
}
concurrentQueue.async {
semaphore.wait()
print("Task B started")
sleep(1)
print("Task B finished")
semaphore.signal()
}本题详细解读
1. 队列类型
- 串行队列 (Serial Queue): 任务按顺序执行,一次只执行一个任务。
- 并发队列 (Concurrent Queue): 任务可以同时执行,适用于需要并行处理的场景。
2. 主队列
- 主队列 (Main Queue): 是一个特殊的串行队列,所有与UI相关的操作都必须在主队列中执行。
3. 异步与同步执行
- async: 异步执行任务,不会阻塞当前线程。
- sync: 同步执行任务,会阻塞当前线程直到任务完成。
4. DispatchGroup
- DispatchGroup: 用于管理一组任务的执行,可以等待所有任务完成后再执行后续操作。
5. DispatchWorkItem
- DispatchWorkItem: 封装一个任务,可以在不同的队列中执行。
6. DispatchSemaphore
- DispatchSemaphore: 用于控制并发任务的数量,通过信号量机制来限制同时执行的任务数。
7. 实际应用场景
- 主队列: 用于更新UI。
- 串行队列: 用于需要顺序执行的任务,如文件读写。
- 并发队列: 用于需要并行处理的任务,如网络请求。
- DispatchGroup: 用于等待多个异步任务完成后再执行某个操作。
- DispatchSemaphore: 用于限制资源访问的并发数,如数据库连接池。