Swift Interview Deep Dive #03

更新 發佈閱讀 10 分鐘

GCD vs Async/Await:Swift Concurrency 到底改變了什麼?

很多 iOS 工程師在面試被問到:

GCD 跟 async/await 差在哪?

通常會回答:

  • GCD 是 callback-based
  • async/await 比較好讀
  • async/await 是新的寫法

但如果答案只停在這裡,其實代表:

你還沒真正理解 Swift Concurrency 在解決什麼問題。

因為 async/await 的重點從來不是:

語法變漂亮

而是:

Swift 開始正式處理「Concurrency Complexity(並發複雜度)」。


1. GCD 真正解決的是「Thread Management」

先回到最早期。

在沒有 GCD 的年代,開發者需要自己管理:

  • thread creation
  • thread scheduling
  • synchronization
  • locking

這非常痛苦。

所以 Apple 推出了:

GCD(Grand Central Dispatch)

核心目標是:

幫你管理 thread queue

例如:

DispatchQueue.global().async {
print("background work")
}

或:

DispatchQueue.main.async {
self.reloadUI()
}

GCD 很強。

但它有一個根本問題:

它只解決了「thread」,沒有解決「state complexity」


2. Callback Hell 其實不是最大問題

很多文章會說:

async/await 是為了解決 callback hell

例如:

fetchUser {
fetchPosts {
fetchComments {
reloadUI()
}
}
}

沒錯。

但這只是表面問題。

真正可怕的是:

你開始無法推理 execution flow

例如:

  • 哪段 code 在 main thread?
  • 哪段 code 在 background?
  • callback 什麼時候回來?
  • state 是不是已經改變?
  • object 還活著嗎?
  • closure 有沒有 retain cycle?

這些才是真正的 concurrency complexity。


3. GCD 最大問題:Concurrency 是「無結構的」

看這段:

DispatchQueue.global().async {

let result = fetchData()

DispatchQueue.main.async {
self.updateUI(result)
}
}

看起來很正常。

但問題其實很多:

  • thread hopping
  • callback nesting
  • lifecycle 不明
  • cancellation 困難
  • ownership 不清楚

而且:

GCD 不知道任務之間的關係

這很重要。


4. Async/Await 真正帶來的是「Structured Concurrency」

這才是核心。

Swift Concurrency 最重要的不是 async/await。

而是:

Structured Concurrency


什麼意思?

以前:

任務是亂飛的

現在:

任務開始有「結構」

例如:

func loadData() async {

let user = await fetchUser()

let posts = await fetchPosts(user)

await MainActor.run {
self.reloadUI(posts)
}
}

現在:

  • execution flow 可讀
  • task relationship 清楚
  • suspension point 明確
  • lifecycle 可追蹤

這不是語法糖。

這是:

Concurrency Model 的改變

5. await 不是「等待」,而是「暫停」

這是超多人誤解的地方。

很多人以為:

await fetch()

代表:

卡住 thread 等結果

其實不是。


真正發生的是:

函式被 suspend(暫停)

thread 可以去做別的事。

等資料回來後:

Swift Runtime 再恢復 execution

所以 async/await 的效能關鍵其實是:

cooperative suspension

不是 thread blocking。


6. MainActor 為什麼重要?

以前 GCD:

DispatchQueue.main.async {
self.reloadUI()
}

現在:

@MainActor
func reloadUI() {

}

這個差異非常大。

以前:

你要自己記得切 thread

現在:

Swift 開始幫你管理 isolation

這代表:

Concurrency 不再只是 thread 問題,而是 data isolation 問題

這也是為什麼:

Actor 會出現

7. Actor 到底解決什麼?

以前:

var count = 0

多 thread:

count += 1

可能 crash。

因為:

shared mutable state

以前做法:

  • lock
  • semaphore
  • serial queue

現在:

actor Counter {
var count = 0
}

Swift 開始用:

isolation model

避免 data race。


8. Async/Await 不代表沒有問題

很多人以為:

用 async/await 就安全了

其實完全不是。

例如:

Task {
await self.fetch()
}

還是可能:

  • retain cycle
  • task leak
  • state race
  • cancellation 問題

因為 concurrency 的本質問題其實是:

state coordination

不是 syntax。


9. 真正危險的是「Task 無限成長」

這是現在很多 SwiftUI 專案開始出現的新問題。

例如:

.onAppear {
Task {
await loadData()
}
}

畫面進出多次:

Task 不斷累積

如果:

  • 沒 cancellation
  • 沒 lifecycle control
  • 沒 isolation

很容易:

  • memory leak
  • duplicated request
  • outdated state

所以 Swift Concurrency 真正重要的是:

Task lifecycle management

10. 面試真正想考的是什麼?

GCD vs Async/Await 這題真正考的其實是:

你是否理解「Concurrency Complexity」

包括:

  • state synchronization
  • task lifecycle
  • data isolation
  • cancellation
  • ownership
  • thread safety

真正成熟的工程師,不會只說:

async/await 比較好讀

而是會知道:

Swift 正在從 thread-based concurrency,走向 state-safe concurrency


結論

GCD 解決的是:

thread scheduling

而 Swift Concurrency 真正想解決的是:

shared mutable state complexity

所以 async/await 的本質從來不是:

新語法

而是:

Swift 開始重新定義「並發程式設計」該怎麼被管理。


延伸思考

如果你開始深入:

  • Actor
  • MainActor
  • TaskGroup
  • Sendable
  • Isolation
  • TCA Effect
  • SwiftUI state flow

你會發現:

Swift 的方向其實越來越明顯:

減少不可預測的共享狀態。

因為:

Concurrency 最大的敵人從來不是 thread
而是 state。
留言
avatar-img
WL的沙龍
0會員
5內容數
Swift • SwiftUI • iOS Focus on state, architecture, and system design.
你可能也想看
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
本章節介紹了程式語言中的各種運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子,以及運算子的優先等級。每種運算子都有對應的範例程式碼和輸出結果,以幫助讀者更好地理解其用法和效果。此外,章節也強調了運算子的優先等級在程式設計中的重要性,並通過範例展示了不同優先等級的運算順序對運算結果的影響。
Thumbnail
本章節介紹了程式語言中的各種運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子,以及運算子的優先等級。每種運算子都有對應的範例程式碼和輸出結果,以幫助讀者更好地理解其用法和效果。此外,章節也強調了運算子的優先等級在程式設計中的重要性,並通過範例展示了不同優先等級的運算順序對運算結果的影響。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News