🕌

【Swift Concurrency】addTaskUnlessCancelledについて

2024/06/23に公開

概要

TaskGroupaddTaskの似たものにaddTaskUnlessCancelledがあります。

addTaskUnlessCancelledaddTaskと同じように使えますが、既にタスクグループがキャンセルされている場合には子タスクの追加を行いません。
また、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が代入されるため、「② 追加失敗」と出力されます。

公式ドキュメント

https://developer.apple.com/documentation/swift/taskgroup/addtaskunlesscancelled(priority:operation:)

Discussion