Swift Concurrency
Priority: P0
Write Structured Async Code
- 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.
See implementation examples for parallel fetch with async let and Task Groups.
Isolate State with Actors
- 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.
See implementation examples for Actor-based state isolation and nonisolated methods.
Manage Task Lifecycle
- 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.