🦁
Swift Concurrency②:Taskとは?
Task を一言で言うと
非同期処理を走らせるための箱
Swift Concurrency では非同期処理をタスクという単位で管理する
Task { ... } を書くと、その中身が 非同期で動く処理として OS に任される
print("A")
Task {
print("B - start")
try? await Task.sleep(nanoseconds: 1_000_000_000) // Taskの処理を1秒止める
print("B - end")
}
print("C")
このコードの場合は
①A
②B - start
③C
④B - end
になる。
Taskが書かれている関数が終わってもTaskは動き続ける
func load() {
print("start")
Task {
try? await Task.sleep(nanoseconds: 1_000_000_000)
print("done") // 1秒後に出力
}
print("end")
}
結果は
①start
②end
③done
親の関数が終わってもタスクは動き続ける。
Task {
let a = await fetchA()
print(a)
}
Task {
let b = await fetchB()
print(b)
}
このように2つあったら2つとも独立して動くので、結果の管理は自分でしないといけない
この問題を解消するのが次回紹介するasync let
まとめ直し
- Task = 非同期処理の箱(実行単位)
- Task {} を書いた瞬間に新しい非同期処理がスタートする
- 外側の処理とは独立して動く
次回はasync letを説明します
Discussion