| name | axiom-ios-concurrency |
|---|---|
| description | Use when writing ANY code with async, actors, threads, or seeing ANY concurrency error. Covers Swift 6 concurrency, @MainActor, Sendable, data races, async/await patterns, performance optimization. |
| user-invocable |
iOS Concurrency Router
You MUST use this skill for ANY concurrency, async/await, threading, or Swift 6 concurrency work.
When to Use
Use this router when: - Writing async/await code - Seeing concurrency errors (data races, actor isolation) - Working with @MainActor - Dealing with Sendable conformance - Optimizing Swift performance - Migrating to Swift 6 concurrency - App freezes during loading (likely main thread blocking)
Conflict Resolution
ios-concurrency vs ios-performance: When app freezes or feels slow: 1. Try ios-concurrency FIRST — Main thread blocking is the #1 cause of UI freezes. Check for synchronous work on @MainActor before profiling. 2. Only use ios-performance if concurrency fixes don't help — Profile after ruling out obvious blocking.
ios-concurrency vs ios-build: When seeing Swift 6 concurrency errors: - Use ios-concurrency, NOT ios-build — Concurrency errors are CODE issues, not environment issues - ios-build is for "No such module", simulator issues, build failures unrelated to Swift language errors
Rationale: A 2-second freeze during data loading is almost always await on main thread or missing background dispatch. Domain knowledge solves this faster than Time Profiler.
Routing Logic
Swift Concurrency Issues
Swift 6 concurrency patterns → /skill axiom-swift-concurrency
- async/await patterns
- @MainActor usage
- Actor isolation
- Sendable conformance
- Data race prevention
- Swift 6 migration
Swift performance → /skill axiom-swift-performance
- Value vs reference types
- Copy-on-write optimization
- ARC overhead
- Generic specialization
- Collection performance
Synchronous actor access → /skill axiom-assume-isolated
- MainActor.assumeIsolated
- @preconcurrency protocol conformances
- Legacy delegate callbacks
- Testing MainActor code synchronously
Thread-safe primitives → /skill axiom-synchronization
- Mutex (iOS 18+)
- OSAllocatedUnfairLock (iOS 16+)
- Atomic types
- Lock vs actor decision
Parameter ownership → /skill axiom-ownership-conventions
- borrowing/consuming modifiers
- Noncopyable types (~Copyable)
- ARC traffic reduction
- consume operator
Concurrency profiling → /skill axiom-concurrency-profiling
- Swift Concurrency Instruments template
- Actor contention diagnosis
- Thread pool exhaustion
- Task visualization
Decision Tree
User asks about concurrency
├─ Concurrency errors?
│ ├─ Data races? → swift-concurrency
│ ├─ Actor isolation? → swift-concurrency
│ ├─ @MainActor? → swift-concurrency
│ └─ Sendable? → swift-concurrency
│
├─ Writing async code? → swift-concurrency
│
├─ assumeIsolated questions? → assume-isolated
│
├─ Mutex/lock/synchronization? → synchronization
│
├─ borrowing/consuming/ownership? → ownership-conventions
│
├─ Profile async performance? → concurrency-profiling
│
└─ Performance optimization? → swift-performance
Critical Patterns
Swift 6 Concurrency (swift-concurrency): - Progressive journey: single-threaded → async → concurrent → actors - @concurrent attribute for forced background execution - Isolated conformances - Main actor mode for approachable concurrency - 11 copy-paste patterns
Swift Performance (swift-performance): - ~Copyable for non-copyable types - Copy-on-write (COW) patterns - Value vs reference type decisions - ARC overhead reduction - Generic specialization
Example Invocations
User: "I'm getting 'data race' errors in Swift 6"
→ Invoke: /skill axiom-swift-concurrency
User: "How do I use @MainActor correctly?"
→ Invoke: /skill axiom-swift-concurrency
User: "My app is slow due to unnecessary copying"
→ Invoke: /skill axiom-swift-performance
User: "Should I use async/await for this network call?"
→ Invoke: /skill axiom-swift-concurrency
User: "How do I use assumeIsolated?"
→ Invoke: /skill axiom-assume-isolated
User: "My delegate callback runs on main thread, how do I access MainActor state?"
→ Invoke: /skill axiom-assume-isolated
User: "Should I use Mutex or actor?"
→ Invoke: /skill axiom-synchronization
User: "What's the difference between os_unfair_lock and OSAllocatedUnfairLock?"
→ Invoke: /skill axiom-synchronization
User: "What does borrowing do in Swift?"
→ Invoke: /skill axiom-ownership-conventions
User: "How do I use ~Copyable types?"
→ Invoke: /skill axiom-ownership-conventions
User: "My async code is slow, how do I profile it?"
→ Invoke: /skill axiom-concurrency-profiling
User: "I think I have actor contention, how do I diagnose it?"
→ Invoke: /skill axiom-concurrency-profiling