关于 axiom-ios-concurrency
面向 Swift/iOS 开发者的并发问题路由技能,按错误类型和上下文将 async/await、Swift 6、线程安全及性能问题导向专门技能或 Agent。
主要功能
- 01按并发主题分流到专门技能
- 02区分 Swift 与 Core Data 线程问题
- 03提供并发问题决策树
- 04支持自动化并发审计路由
适用场景
- 01排查 Swift 6 数据竞争与隔离错误
- 02处理应用加载时界面冻结
- 03选择 actor、锁或 Combine 模式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-ios-concurrency安装后在 Claude Code 中输入/axiom-ios-concurrency确认已加载。
详细介绍
iOS 并发路由
任何并发、async/await、线程处理或 Swift 6 并发工作都必须使用此技能。
适用场景
在以下情况下使用此路由:
- 编写 async/await 代码
- 遇到并发错误(数据竞争、Actor 隔离)
- 使用 @MainActor
- 处理 Sendable 一致性
- 优化 Swift 性能
- 迁移到 Swift 6 并发
- 应用在加载期间卡顿(可能是主线程阻塞)
冲突处理
ios-concurrency 与 ios-performance:当应用卡顿或感觉运行缓慢时:
- 先尝试 ios-concurrency —— 主线程阻塞是导致 UI 卡顿的首要原因。在开始性能分析前,先检查 @MainActor 上是否有同步工作。
- 仅在并发修复无效时使用 ios-performance —— 排除明显的阻塞后再进行性能分析。
ios-concurrency 与 ios-build:遇到 Swift 6 并发错误时:
- 使用 ios-concurrency,而不是 ios-build —— 并发错误属于代码问题,而非环境问题
- ios-build 适用于 “No such module”、模拟器问题,以及与 Swift 语言错误无关的构建失败
ios-concurrency 与 ios-data:并发错误涉及 Core Data 或 SwiftData 时:
- Core Data 线程处理(NSManagedObjectContext 线程隔离、performBackgroundTask)→ 先使用 ios-data —— Core Data 有自己的线程模型,与 Swift 并发不同
- SwiftData + @MainActor ModelContext → 使用 ios-concurrency —— 这是 Swift 并发隔离问题
- 一般性的“后台保存导致数据丢失” → 先使用 ios-data —— 框架特定的线程规则优先
理由:数据加载期间卡顿 2 秒,几乎总是因为在主线程上执行 await 或缺少后台调度。领域知识比 Time Profiler 更快地解决问题。Core Data 线程处理违规需要 Core Data 特定的修复,而不是通用并发模式。
路由逻辑
Swift 并发问题
Swift 6 并发模式 → /skill axiom-swift-concurrency
- async/await 模式
- @MainActor 用法
- Actor 隔离
- Sendable 一致性
- 防止数据竞争
- Swift 6 迁移
Swift 并发 API 参考 → /skill axiom-swift-concurrency-ref
- Actor 定义、重入、全局 Actor
- Sendable 模式、@unchecked Sendable
- Task/TaskGroup/取消 API
- AsyncStream、continuations
- 从 DispatchQueue 迁移到 Actor
Swift 性能 → /skill axiom-swift-performance
- 值类型与引用类型
- 写时复制优化
- ARC 开销
- 泛型特化
- 集合性能
同步访问 Actor → /skill axiom-assume-isolated
- MainActor.assumeIsolated
- @preconcurrency 协议一致性
- 旧版委托回调
- 同步测试 MainActor 代码
线程安全原语 → /skill axiom-synchronization
- Mutex(iOS 18+)
- OSAllocatedUnfairLock(iOS 16+)
- 原子类型
- Lock 与 Actor 的选择
参数所有权 → /skill axiom-ownership-conventions
- borrowing/consuming 修饰符
- 不可复制类型(~Copyable)
- 减少 ARC 流量
- consume 运算符
并发性能分析 → /skill axiom-concurrency-profiling
- Swift Concurrency Instruments 模板
- Actor 竞争诊断
- 线程池耗尽
- Task 可视化
Combine 响应式模式 → /skill axiom-combine-patterns
- Publisher/Subscriber 生命周期、AnyCancellable
- Combine 与 async/await 的选择
- @Published + ObservableObject
- 运算符模式、桥接
自动扫描
并发审计 → 启动 concurrency-auditor Agent 或运行 /axiom:audit concurrency(5 阶段语义审计:映射隔离架构、检测 8 种反模式、推理缺失的并发模式、关联复合风险、评估 Swift 6.3 就绪度)
决策树
- 数据竞争/Actor 隔离/@MainActor/Sendable?→ swift-concurrency 1a. 需要特定 API 语法(Actor 定义、TaskGroup、AsyncStream、continuation)?→ swift-concurrency-ref
- 编写 async/await 代码?→ swift-concurrency
- 迁移到 Swift 6?→ swift-concurrency
- assumeIsolated/@preconcurrency?→ assume-isolated
- Mutex/锁/同步?→ synchronization
- borrowing/consuming/~Copyable?→ ownership-conventions
- 分析异步性能/Actor 争用?→ concurrency-profiling
- 值类型/ARC/泛型优化?→ swift-performance
- 想要自动化并发扫描?→ concurrency-auditor(Agent)
- Combine/@Published/AnyCancellable/响应式流?→ combine-patterns
避免自我合理化
| 想法 | 实际情况 |
|---|---|
| “只要加上 @MainActor 就能用了” | @MainActor 有隔离继承规则。swift-concurrency 涵盖所有模式。 |
| “我会用 nonisolated(unsafe) 来消除警告” | 消除警告会掩盖数据竞争。swift-concurrency 展示了安全的模式。 |
| “这只是一次异步调用” | 即使是单次异步调用,也涉及取消和隔离问题。swift-concurrency 涵盖了这些内容。 |
| “我知道 Actor 的工作原理” | Swift 6.2 中 Actor 可重入性和隔离规则已发生变化。swift-concurrency 涵盖最新内容。 |
| “我以后再处理 Sendable 警告” | 违反 Sendable 会导致运行时崩溃。swift-concurrency 能立即正确修复这些问题。 |
| “Combine 已经过时了,直接用 async/await 就好” | Combine 尚未发布弃用通知。重写正常运行的管线会浪费时间并引入错误。combine-patterns 涵盖渐进式迁移。 |
关键模式
Swift 6 并发(swift-concurrency):
- 渐进式路径:单线程 → 异步 → 并发 → Actor
- 使用 @concurrent 特性强制在后台执行
- 隔离一致性
- 更易上手的并发主线程模式
- 11 种可直接复制粘贴的模式
Swift 性能(swift-performance):
- 使用 ~Copyable 实现不可复制类型
- 写时复制(COW)模式
- 值类型与引用类型的选择
- 降低 ARC 开销
- 泛型特化
示例调用
用户:“我在 Swift 6 中遇到了‘data race’错误”
→ 调用:/skill axiom-swift-concurrency
用户:“如何正确使用 @MainActor?”
→ 调用:/skill axiom-swift-concurrency
用户:“我的应用因为不必要的复制而运行缓慢”
→ 调用:/skill axiom-swift-performance
用户:“这个网络调用应该使用 async/await 吗?”
→ 调用:/skill axiom-swift-concurrency
用户:“如何使用 assumeIsolated?”
→ 调用:/skill axiom-assume-isolated
用户:“我的代理回调在主线程上运行,如何访问 MainActor 状态?”
→ 调用:/skill axiom-assume-isolated
用户:“应该使用 Mutex 还是 actor?”
→ 调用:/skill axiom-synchronization
用户:“os_unfair_lock 和 OSAllocatedUnfairLock 有什么区别?”
→ 调用:/skill axiom-synchronization
用户:“borrowing 在 Swift 中有什么作用?”
→ 调用:/skill axiom-ownership-conventions
用户:“如何使用 ~Copyable 类型?”
→ 调用:/skill axiom-ownership-conventions
用户:“我的异步代码很慢,如何分析其性能?”
→ 调用:/skill axiom-concurrency-profiling
用户:“我觉得有 actor 争用,如何诊断?”
→ 调用:/skill axiom-concurrency-profiling
用户:“我的 Core Data 保存操作丢失了后台任务中的数据”
→ 路由至:ios-data router(Core Data 线程处理特定于框架)
用户:“如何创建 TaskGroup?”
→ 调用:/skill axiom-swift-concurrency-ref
用户:“AsyncStream API 是什么?”
→ 调用:/skill axiom-swift-concurrency-ref
用户:“如何创建自定义全局 actor?”
→ 调用:/skill axiom-swift-concurrency-ref
用户:“如何将 completion handler 转换为 async?”
→ 调用:/skill axiom-swift-concurrency-ref
用户:“actor 重入规则是什么?”
→ 调用:/skill axiom-swift-concurrency-ref
用户:“我的 Combine 管道突然停止生成值,且没有任何提示”
→ 调用:/skill axiom-combine-patterns
用户:“这个数据流应该使用 Combine 还是 async/await?”
→ 调用:/skill axiom-combine-patterns
用户:“如何将 Combine 发布者桥接到 async/await 代码中?”
→ 调用:/skill axiom-combine-patterns
用户:“AnyCancellable 导致内存泄漏”
→ 调用:/skill axiom-combine-patterns
用户:“检查我的代码是否存在 Swift 6 并发问题”
→ 调用:concurrency-auditor agent