這篇將會寫一些應用會遇到的問提與原因.
import Foundation
import _Concurrency
// 模擬耗時的非同步任務
func fakeTask(_ id: Int, seconds: UInt64) async -> String {
try? await Task.sleep(nanoseconds: seconds * 1_000_000_000)
return "任務 \(id) 完成,用時 \(seconds) 秒"
}
let start = Date() // 紀錄開始時間
// 建立多個 async let 任務
async let t1 = fakeTask(1, seconds: 2)
async let t2 = fakeTask(2, seconds: 3)
async let t3 = fakeTask(3, seconds: 1)
async let t4 = fakeTask(4, seconds: 5)
async let t5 = fakeTask(5, seconds: 4)
// 等待所有結果
let results = await [t1, t2, t3, t4, t5]
for r in results {
print(r)
}
let end = Date()
let total = end.timeIntervalSince(start)
print("總耗時:\(String(format: "%.2f", total)) 秒")
核心觀念:
async let 宣告後,任務會馬上開始執行,但不會立即等待。
await [t1, t2, t3, t4, t5] 時,才會等待所有任務完成。
執行時間:
雖然每個任務都有不同耗時 (1~5 秒),但它們是同時開始的。
總耗時 ≈ 最長的任務時間 (5 秒)。
如果用 await fakeTask(...) 依序執行,總耗時會是 全部加總 15 秒。
輸出順序:
任務完成的順序由實際執行時間決定,不一定照 t1~t5 宣告順序。
但因為 await [t1, t2, t3, t4, t5] 會把結果依照宣告順序包裝回陣列,輸出還是 t1 → t5。
開始 → 同時啟動 t1~t5 →
最短的 t3 完成(1s) → t1(2s) → t2(3s) → t5(4s) → t4(5s) →
全部完成後收集結果 → 計算總耗時