🔥

Swift Concurrency③:async let とは?

に公開

async let を一言で言うと

「同時に走らせたい非同期処理を、一時的な変数に入れて並列実行する仕組み」

イメージ
Task は「箱をつくって処理を走らせる」感じ
async let は 並列で宿題を配って、最後に一気に回収する イメージ」

コードで解説

async let a = fetchUser()
async let b = fetchImage()

// ここで一気に結果を待つ
let (user, image) = await (a, b)

①async let a = fetchUser()

fetchUser()が非同期関数だとして、
async let a = fetchUser()と宣言した時(ここに処理が来た時)にfetchUserの処理が走ります。
つまりこの時点で「ユーザー情報を取ってきて!」というリクエストがスタート。
ただし、まだ結果(値)は手元に来ていません。

②async let b = fetchImage()

同じように画像をとってくると言う処理も同時に走ります。
つまり①のfetchUser()と②のfetchImage()が並列に走ります。

③let (user, image) = await (a, b)

まだa と bの結果待ちの状態
awaitをつけることにより、aとbの処理が終わるまで次の処理に行かなくなります。
そしてaとb両方の処理が完了したら(user, image)に結果が代入される

普通に await fetchUser(); await fetchImage() と書いた場合はどうなる?

await fetchUser()
await fetchImage()

この場合は
fetchUser()が終わったら、fetchImage()が呼ばれる順番になります

一方、async let を使うと
ユーザー情報と画像取得が同時に走るので、全体の待ち時間が短縮できる わけです。

Discussion