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 ๐#
GitHub Comments