Motivation

iOS ๊ฐœ๋ฐœ์—์„œ UI ์—…๋ฐ์ดํŠธ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด์•ผ ํ•˜์ง€๋งŒ, Swift Concurrency ๋„์ž… ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ Task ๋‚ด์—์„œ UI๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ์‰ฌ์›Œ์กŒ๋‹ค. @MainActor๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„๋ถ€ํ„ฐ ์ด ๋ฌธ์ œ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด ์ค€๋‹ค. ์ด ๊ธ€์—์„œ MainActor์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Task { // ๋ฐฑ๊ทธ๋ผ์šด๋“œ Task (Global Actor)
    let data = await fetchUser()      
    userNameLabel.text = data.name  // UI ์—…๋ฐ์ดํŠธ (MainActor ํ•„์š”!)
}

Overview

1. MainActor๋Š” ์–ธ์ œ ํ•„์š”ํ• ๊นŒ? (๋ฌธ์ œ ์ƒํ™ฉ)

1-1. UIKit์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ œ์•ฝ

1-2. GCD์˜ ํ•œ๊ณ„ (DispatchQueue.main.async)

1-3. Swift Concurrency์˜ ํ•จ์ • (Task + UI ์„ž๊ธฐ)

2. MainActor ๊ธฐ๋ณธ ๊ฐœ๋…

2-1. MainActor ์•Œ๊ธฐ ์ „ Actor๊ฐ€ ๋ฌด์—‡์ธ์ง€

2-2. Global Actor์™€ MainActor

2-3. @MainActor ์†์„ฑ์˜ ์˜๋ฏธ

3. ์‚ฌ์šฉ๋ฒ•

3-1. ํ•จ์ˆ˜/ํ”„๋กœํผํ‹ฐ์— ์ ์šฉ

3-2. ํด๋ž˜์Šค ์ „์ฒด์— ์ ์šฉ (ViewModel ํŒจํ„ด)

3-3. SwiftUI์™€์˜ ์™„๋ฒฝ ํ˜ธํ™˜ (@Published)

4. Task์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

4-1. Task { @MainActor in }

4-2. await MainActor.run { }

4-3. Task.detached + MainActor ์ „ํ™˜

5. ๋” ์•Œ์•„๋ณด๊ธฐ

5-1. nonisolated ํƒˆ์ถœ๊ตฌ

5-2. @Sendable๊ณผ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

5-3. MainActor ํ˜ธํ•‘ ์ตœ์ ํ™”

6. MainActor์™€ DispatchQueue ๋น„๊ต

6-1. @MainActor vs DispatchQueue.main

6-2. ๋‹ค๋ฅธ ๊ธ€๋กœ๋ฒŒ ์•กํ„ฐ์™€ ๋น„๊ต

References ๐Ÿ‘€