在 Swift 中,你可以使用闭包、函数或者协议来实现一个任务链(Task Chain)。每个任务在完成时调用下一个任务,直到所有任务完成。以下是一个使用闭包的简单任务链实现示例:
import Foundation
// 定义任务类型,任务是一个接受一个完成回调的函数
typealias Task = (@escaping () -> Void) -> Void
// 定义一个类来管理任务链
class TaskChain {
private var tasks: [Task] = []
// 添加任务到链中
func addTask(_ task: @escaping Task) {
tasks.append(task)
}
// 开始执行任务链
func start() {
runNextTask()
}
private func runNextTask() {
guard !tasks.isEmpty else {
print("所有任务完成")
return
}
// 取出第一个任务并执行
let task = tasks.removeFirst()
task { [weak self] in
// 当任务完成时,执行下一个任务
self?.runNextTask()
}
}
}
// 示例任务
func task1(completion: @escaping () -> Void) {
print("执行任务1")
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
print("任务1完成")
completion()
}
}
func task2(completion: @escaping () -> Void) {
print("执行任务2")
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
print("任务2完成")
completion()
}
}
func task3(completion: @escaping () -> Void) {
print("执行任务3")
DispatchQueue.global().asyncAfter(deadline: .now() + 1.5) {
print("任务3完成")
completion()
}
}
// 创建任务链并添加任务
let taskChain = TaskChain()
taskChain.addTask(task1)
taskChain.addTask(task2)
taskChain.addTask(task3)
// 开始任务链
taskChain.start()
代码说明:
Task 是一个类型别名,表示一个接受闭包的异步任务。
TaskChain 类用于管理任务链,通过 addTask 方法添加任务,start 方法启动任务链。
runNextTask 方法依次取出并执行任务链中的任务,每个任务在完成后调用下一个任务。
示例任务:
task1, task2, 和 task3 是三个模拟的异步任务,它们在执行后调用 completion,触发链中下一个任务的执行。
结果:
当你运行代码时,任务将按照添加的顺序依次执行,直到所有任务完成。
扩展:
针对同一个任务,实现不同环节的任务链呢?你能修改实现吗?