Task、TaskGroup、actor 的作用分别是什么 swift

 

Task、 类比oc的NSOperation  能设置优先级、可取消任务 但是没有操作依赖 

TaskGroup、类比oc的DispatchGroup和OperationQueue  等待多张图片下载完合成一张图片

actor  类比oc的信号量dispatch_semaphore 加锁 控制并发

 

这是 Swift 并发(Swift Concurrency) 面试里的核心三件套,几乎必问。下面我给你一个面试可直接说的答案,再加一层稍微深入的对比,方便你应对追问。

一、面试标准答案(推荐背)

1️⃣ Task —— 执行异步任务的单元

作用:
• 用来启动并管理一个异步任务

• 是 Swift 并发中最基本的执行单位

特点:
• 可以在同步上下文中启动异步代码

• 支持优先级、取消、父子关系
Task {
    let result = try await fetchData()
}


✅ 适合:单个异步任务

2️⃣ TaskGroup —— 并发执行多个子任务

作用:
• 用来创建一组并发执行的子任务

• 支持动态数量任务、统一生命周期管理

特点:
• 所有子任务完成后,group 才算完成

• 自动传播取消
await withTaskGroup(of: Int.self) { group in
    group.addTask { 1 }
    group.addTask { 2 }

    for await value in group {
        print(value)
    }
}


✅ 适合:并发执行多个任务并收集结果

3️⃣ actor —— 保护可变状态的并发安全类型

作用:
• 提供一种安全的并发访问模型

• 防止数据竞争(Data Race)

特点:
• 本质是引用类型(类似 class)

• 内部状态只能由 actor 自己修改

• 外部访问必须 await
actor Counter {
    private var value = 0

    func increment() {
        value += 1
    }
}


✅ 适合:并发环境下的共享可变状态

二、一句话对比(面试加分)

概念 核心作用

Task 执行单个异步任务

TaskGroup 并发执行多个任务

actor 保证并发访问安全

三、它们之间的关系(进阶理解)

• Task 是执行体

• TaskGroup 是 Task 的组织者

• actor 是被 Task 安全访问的对象

✅ 常见组合模式:
Task {
    await withTaskGroup(of: Void.self) { group in
        group.addTask {
            await counter.increment()
        }
    }
}


四、常见面试追问 & 标准答法

Q:Task 会自动切换线程吗?

✅ 是的  
• 由 Swift 并发运行时调度  

• 不需要手动 DispatchQueue

Q:actor 和 class 的区别?

对比 actor class

并发安全 ✅ ❌

访问方式 await 直接

本质 引用类型 引用类型

Q:TaskGroup 和 async let 的区别?

对比 TaskGroup async let

任务数量 动态 静态

复杂度 高 低

推荐 多任务 少量任务

五、一句终极总结(面试收尾)

Task 负责执行异步任务,TaskGroup 负责并发组织任务,actor 负责在并发环境中安全地保护状态,三者共同构成了 Swift 的结构化并发模型。

 

posted @ 2026-06-10 22:42  黄增松  阅读(10)  评论(0)    收藏  举报