문법 (28) Swift Concurrency (async/await, Task, actor)
Swift에서 Swift Concurrency (async/await, Task, actor)의 개념과 활용법을 설명합니다.
문법 (28) Swift Concurrency (async/await, Task, actor)
Swift Concurrency (async/await, Task, actor)
Swift의 Concurrency(동시성) 기능은 비동기 프로그래밍을 더욱 안전하고 직관적으로 만들기 위해 도입되었습니다.
이를 통해 async/await, Task, actor를 활용하여 코드를 더 쉽게 관리할 수 있습니다.
1. async와 await 기본 개념
1
2
3
4
5
6
7
8
func fetchData() async -> String {
return "데이터 로드 완료"
}
Task {
let result = await fetchData()
print(result)
}
async키워드를 사용하여 비동기 함수 선언await을 사용하여 비동기 함수의 실행 결과를 기다림
2. Task를 활용한 비동기 실행
1
2
3
4
Task {
let first = await fetchData()
print(first)
}
Task블록을 활용하여 비동기 코드 실행
3. TaskGroup을 활용한 병렬 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import Foundation
func performParallelTasks() async {
await withTaskGroup(of: String.self) { group in
for i in 1...3 {
group.addTask {
return "작업 \(i) 완료"
}
}
for await result in group {
print(result)
}
}
}
Task {
await performParallelTasks()
}
TaskGroup을 사용하여 여러 개의 비동기 작업을 동시에 실행 가능
4. actor를 활용한 스레드 안전성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
actor Counter {
private var value = 0
func increment() {
value += 1
}
func getValue() -> Int {
return value
}
}
let counter = Counter()
Task {
await counter.increment()
print(await counter.getValue())
}
actor는 멀티스레드 환경에서도 안전한 데이터 접근을 보장
5. @MainActor를 활용한 UI 업데이트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import SwiftUI
@MainActor
class ViewModel: ObservableObject {
@Published var message = ""
func fetchData() async {
await Task.sleep(2 * 1_000_000_000) // 2초 지연
message = "데이터 업데이트 완료"
}
}
let viewModel = ViewModel()
Task {
await viewModel.fetchData()
print(viewModel.message)
}
@MainActor를 사용하여 UI 업데이트를 메인 스레드에서 안전하게 실행
Swift Concurrency를 활용하면 보다 간결하고 직관적인 비동기 프로그래밍이 가능합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.