関数


withTaskGroup(of:returning:isolation:
body:)


動的な数の子タスクを含めることができる新しいスコープを開始します。


iOS 13.0+ iPadOS 13.0+ Mac Catalyst 13.0+ macOS 10.15+

tvOS 13.0+ visionOS 1.0+ watchOS 6.0+

@backDeployed(before: macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0)
func withTaskGroup<ChildTaskResult, GroupResult>(
    of childTaskResultType: ChildTaskResult.Type = ChildTaskResult.self,
    returning returnType: GroupResult.Type = GroupResult.self,
    isolation: isolated (any Actor)? = #isolation,
    body: (inout TaskGroup<ChildTaskResult>) async -> GroupResult
) async -> GroupResult where ChildTaskResult : Sendable




議論


グループは、すべての子タスクが完了するかキャンセルされるまで待機してから戻ります。この関数から戻った後、タスクグループは常に空になります。


グループの子タスクの結果を収集するには、for-await-in ループを使用して下さい。


var sum = 0
for await result in group {
    sum += result
}

より詳細な制御が必要な場合、または結果が少数の場合、 next() を直接呼び出すことができます。


guard let first = await group.next() else {
    group.cancelAll()
    return 0
}
let second = await group.next() ?? 0
group.cancelAll()
return first + second


TaskGroup のキャンセル


タスクグループで cancelAll() メソッドを呼び出すか、グループが実行中のタスクをキャンセルすることによって、タスクグループとそのすべての子タスクをキャンセルできます。


キャンセルされたグループ内に新しいタスクを作成するために addTask(name:priority:operation:) を呼び出すと、そのタスクは作成後すぐにキャンセルされます。あるいは、addTaskUnlessCancelled(name:priority:operation:) を呼び出すこともできます。これは、グループが既にキャンセルされている場合はタスクを作成しません。これら 2 つの関数のどちらかを選択することで、グループ内のキャンセルへの対応方法をあなたが制御できます。キャンセルの有無にかかわらず実行する必要がある子タスクもあれば、有用な結果を生成できないことが分かっている場合は作成しない方がよいタスクもあります。


このメソッドでグループにあなたが追加するタスクは throw しないため、キャンセルが発生した場合に CancellationError を throw して応答することはできません。タスクは、完了した作業を返す、空の結果を返す、nil を返すなど、何らかの方法でキャンセルを処理しなければなりません。エラーを throw してキャンセルを処理する必要があるタスクの場合は、代わりに withThrowingTaskGroup(of:returning:body:) メソッドを使用してください。





以下も見よ


タスク


struct Task

非同期作業の単位。


struct TaskGroup

動的に作成された子タスクを含むグループ。




@@@@@@@@@@@@@@
9/13ここまで
@@@@@@@@@@@@@@


struct ThrowingTaskGroup

Throw し、動的に作成された子タスクを含むグループ。


func withThrowingTaskGroup<ChildTaskResult, GroupResult>(of: ChildTaskResult.Type, returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout ThrowingTaskGroup<ChildTaskResult, any Error>) async throws -> GroupResult) async rethrows -> GroupResult

動的な数の throw する子タスクを含めることができる新しいスコープを開始します。


struct TaskPriority

タスクの優先度。


struct DiscardingTaskGroup

動的に作成された子タスクを含む破棄するグループ。


func withDiscardingTaskGroup<GroupResult>(returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout DiscardingTaskGroup) async -> GroupResult) async -> GroupResult

動的な数の子タスクを含めることができる新しいスコープを開始します。


struct ThrowingDiscardingTaskGroup

動的に作成された子タスクを含む throw する破棄のグループ。


func withThrowingDiscardingTaskGroup<GroupResult>(returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout ThrowingDiscardingTaskGroup<any Error>) async throws -> GroupResult) async throws -> GroupResult

動的な数の子タスクを含めることができる新しいスコープを開始します。


struct UnsafeCurrentTask

現在のタスクへの安全でない参照。














トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ