ThrowingTaskGroup
A group that contains throwing, dynamically created child tasks.
- iOS
- 13.0+
- macOS
- 10.15+
- tvOS
- 13.0+
- watchOS
- 6.0+
@frozen struct ThrowingTaskGroup<ChildTaskResult, Failure> where ChildTaskResult : Sendable, Failure : Error
To create a throwing task group, call the withThrowingTaskGroup(of:returning:body:)
method.
Don’t use a task group from outside the task where you created it. In most cases, the Swift type system prevents a task group from escaping like that because adding a child task to a task group is a mutating operation, and mutation operations can’t be performed from concurrent execution contexts like a child task.
Task execution order
Tasks added to a task group execute concurrently, and may be scheduled in any order.
Cancellation behavior
A task group becomes cancelled in one of the following ways:
when
cancelAll
is invoked on it,when an error is thrown out of the
withThrowingTaskGroup(...) { }
closure,when the
Task
running this task group is cancelled.
Since a ThrowingTaskGroup
is a structured concurrency primitive, cancellation is automatically propagated through all of its child-tasks (and their child tasks).
A cancelled task group can still keep adding tasks, however they will start being immediately cancelled, and may act accordingly to this. To avoid adding new tasks to an already cancelled task group, use addTaskUnlessCancelled(priority:body:)
rather than the plain addTask(priority:body:)
which adds tasks unconditionally.
For information about the language-level concurrency model that ThrowingTaskGroup
is part of, see Concurrency in The Swift Programming Language.