Swift Concurrency
Priority: P0
Implementation Guidelines
async/await (Structured Concurrency)
- Async Functions: Mark with
asyncand call withawait. async let: Useasync letfor parallel execution when multiple tasks are independent.- Task Groups: Use
withTaskGrouporwithThrowingTaskGroupfor spawning a dynamic number of tasks. - Error Handling: Combine with
throws. Always handleCancellationError.
Actors (Thread Safety)
- Data Isolation: Use
actorfor shared mutable state to avoid data races. @MainActor: Annotate UI classes (Views, ViewModels) with@MainActorfor main thread execution. UseMainActor.run { ... }for inline UI updates in async blocks.- Global Actors: Use
@GlobalActorfor specific thread-bound resources. - nonisolated: Use
nonisolatedfor methods that don't access actor state to avoid unnecessary hops.
Task Management
- Task Hierarchy: Inherit isolation by using
Task { ... }. - Cancellation: Explicitly check
Task.isCancelledin long loops. Usetry Task.checkCancellation()for throwing functions. - Detached Tasks: Avoid
Task.detachedunless you explicitly want to break context inheritance.
Anti-Patterns
- No synchronous work in @MainActor: Do not block the main thread.
- No UI updates off @MainActor: Always dispatch back to main via
MainActor. - No ignored cancellation: Always check and propagate cancellation.
References
- async/await & Actors