iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Mobile Development

Xcode x Swift Vibe coding進階開發之旅系列 第 10

Xcode x Swift Vibe coding進階開發之旅 第十天 非同步(2) async/await與應用

  • 分享至 

  • xImage
  •  

說明

這篇將會寫一些應用會遇到的問提與原因./images/emoticon/emoticon08.gif

內容

程式

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)) 秒")

結果

https://ithelp.ithome.com.tw/upload/images/20250924/20168187Qws3R6NHSW.png

說明

核心觀念:

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) → 
全部完成後收集結果 → 計算總耗時

上一篇
Xcode x Swift Vibe coding進階開發之旅 第九天 swift高階語法非同步(1) async/await與基本介紹
下一篇
Xcode x Swift Vibe coding進階開發之旅 第十一天 非同步(3) async/await與執行緒
系列文
Xcode x Swift Vibe coding進階開發之旅12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
yulin494
iT邦新手 4 級 ‧ 2025-09-24 15:03:25

/images/emoticon/emoticon19.gif

fivegold iT邦新手 5 級 ‧ 2025-09-24 15:05:17 檢舉

/images/emoticon/emoticon69.gif

我要留言

立即登入留言