🕌
【Swift Concurrency】addTaskUnlessCancelledについて
概要
TaskGroup
のaddTask
の似たものにaddTaskUnlessCancelled
があります。
addTaskUnlessCancelled
はaddTask
と同じように使えますが、既にタスクグループがキャンセルされている場合には子タスクの追加を行いません。
また、addTask
とは異なり、返り値(Bool)をもちます。この返り値は、子タスクの追加を行ったか否かを示すものです。(子タスクが追加された場合trueが返り、追加されなかった場合falseが返ります。)
以下サンプルコードです。
Task {
let task = Task {
await withDiscardingTaskGroup { group in
let result1 = group.addTaskUnlessCancelled {
print("① Hello, world.")
}
if result1 {
print("① 追加成功")
} else {
print("① 追加失敗")
}
try? await Task.sleep(for: .seconds(3))
group.cancelAll()
let result2 = group.addTaskUnlessCancelled {
print("② Hello, world.")
}
if result2 {
print("② 追加成功")
} else {
print("② 追加失敗")
}
}
}
try? await Task.sleep(for: .seconds(1))
task.cancel()
}
出力結果は以下の通りです。「② 追加失敗」に関しては、少し遅れて出力されます。
① Hello, world.
① 追加成功
② 追加失敗
生成したTask
は定数task
で保持し、1秒待った後にtask
をキャンセルします。そのため、2回目のgroup.addTaskUnlessCancelled
呼び出し時には、既にタスクグループはキャンセルされているため、こタスクの追加を行いません。そしてresult2
にはfalseが代入されるため、「② 追加失敗」と出力されます。
公式ドキュメント
Discussion