iOS의 동시성(Concurrency)
2025. 1. 24. 22:46ㆍiOS
반응형
iOS의 동시성(Concurrency)은 앱이 동시에 여러 작업을 수행하도록 지원하는 기능입니다. 동시성을 사용하면 백그라운드에서 작업을 수행하면서 메인 스레드에서 UI를 원활하게 유지할 수 있습니다. iOS에서 동시성을 구현하는 주요 방식은 다음과 같습니다:
1. GCD (Grand Central Dispatch)
GCD는 작업을 큐에 제출하고 비동기로 실행되도록 하는 저수준 API입니다.
- 작업 큐 종류
- Main Queue: UI 업데이트를 위해 사용 (메인 스레드).
- Global Queues: 백그라운드 작업에 사용 (QoS에 따라 분류).
- Custom Queues: 특정 작업을 위해 사용자 정의 큐를 생성.
// 백그라운드 작업
DispatchQueue.global(qos: .background).async {
// 비동기 작업 수행
let result = doHeavyWork()
DispatchQueue.main.async {
// UI 업데이트
self.updateUI(result)
}
}
2. Operation 및 OperationQueue
Operation은 작업 단위를 정의하고 OperationQueue에서 이를 관리합니다. GCD보다 추상화된 고수준 API로, 작업 간의 의존성을 설정하거나 취소할 수 있습니다.
let operationQueue = OperationQueue()
let operation1 = BlockOperation {
print("Task 1")
}
let operation2 = BlockOperation {
print("Task 2")
}
operation2.addDependency(operation1) // Task 2는 Task 1 이후 실행
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
3. Swift Concurrency (async/await)
iOS 13 이상에서 사용할 수 있으며, iOS 15 이상에서는 Structured Concurrency가 도입되었습니다. 이를 통해 코드를 더 간결하고 읽기 쉽게 작성할 수 있습니다.
주요 키워드
- async: 비동기 함수 정의.
- await: 비동기 함수 호출.
- Task: 비동기 컨텍스트에서 작업 실행.
func fetchData() async -> String {
// 비동기 작업 수행
try? await Task.sleep(nanoseconds: 1_000_000_000) // 1초 대기
return "Data fetched"
}
func loadData() {
Task {
let data = await fetchData()
print(data)
}
}
4. Combine Framework
iOS 13 이상에서 도입된 반응형 프로그래밍 방식으로, 데이터 흐름과 상태 변화를 처리합니다.
import Combine
var cancellables = Set<AnyCancellable>()
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map(\.data)
.decode(type: MyModel.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: {
completion in print(completion)
}, receiveValue: { model in
print(model)
})
.store(in: &cancellables)
5. 동시성과 QoS (Quality of Service)
작업의 우선순위를 설정하여 시스템 리소스를 효율적으로 사용할 수 있습니다.
- User-Interactive: UI와 관련된 작업.
- User-Initiated: 사용자가 요청한 작업.
- Utility: 긴 시간 동안 실행되는 작업 (예: 파일 다운로드).
- Background: 우선순위가 낮은 작업.
DispatchQueue.global(qos: .userInitiated).async {
// 높은 우선순위의 백그라운드 작업
}
비교
방식장점사용 예시
GCD | 간단한 API, 낮은 오버헤드 | 간단한 백그라운드 작업. |
OperationQueue | 작업 취소, 의존성 설정 지원 | 복잡한 작업 흐름 관리. |
Swift Concurrency | 간결하고 직관적인 코드 작성 | iOS 15 이상에서 최신 동시성 활용. |
Combine | 반응형 데이터 흐름 관리 | 네트워크 요청과 데이터 스트림 처리. |
어떤 동시성 방법을 사용할지 정하기 위해 앱의 요구사항, 최소 iOS 버전, 코드 복잡성을 고려하세요.
반응형
'iOS' 카테고리의 다른 글
[iOS] Webview Deep Link/Universal Link (1) | 2025.01.25 |
---|---|
[iOS] WKWebView (1) | 2025.01.25 |
모바일 개발 시 협업의 중요성 (1) | 2025.01.21 |
[QA] QA담당자와 협업하기 (1) | 2025.01.21 |
[기획] 기획자와 협업하기 (1) | 2025.01.21 |