Swift 实现一个任务链

在 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,触发链中下一个任务的执行。

结果:
当你运行代码时,任务将按照添加的顺序依次执行,直到所有任务完成。

扩展:
针对同一个任务,实现不同环节的任务链呢?你能修改实现吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。