반응형
두가지 모두 비동기 프로그래밍을 위해 사용되는 기술로, 멀티 스레딩 및 동시성 처리를 할때 사용된다.
두 기술에 대한 비교는 다음과 같다.
- 비동기 작업 처리:
- 두 기술 모두 비동기적으로 작업을 수행할 수 있다. 이를 통해 메인 스레드가 블로킹되지 않으며, 사용자 인터페이스가 멈추지 않게 할 수 있다.
- 멀티 스레딩 지원:
- GCD는 작업을 비동기적으로 다양한 큐에서 실행하고, Swift Concurrency는 태스크를 사용하여 비동기 코드를 스케줄링한다.
- 둘 다 멀티코어 CPU의 성능을 활용해 병렬 처리가 가능하다.
- 스레드 관리 자동화:
- GCD는 스레드 풀을 관리하여 시스템 리소스를 효율적으로 사용한다.
- Swift Concurrency도 내부적으로 Task Scheduler를 사용하여 스레드 관리와 태스크 스케줄링을 자동으로 최적화한다.
- QoS (Quality of Service):
- 두 기술 모두 작업의 우선 순위를 지정할 수 있습니다.
- GCD에서는 DispatchQoS를 사용해 작업 우선 순위를 설정한다.
- Swift Concurrency에서는 Task의 우선 순위를 조정할 수 있다 (Task(priority: .high) 등).
- 두 기술 모두 작업의 우선 순위를 지정할 수 있습니다.
- 캔슬 가능한 작업:
- GCD에서 작업을 수동으로 취소할 수 있는 것은 아니지만, Swift Concurrency에서는 Task를 취소할 수 있다. 다만, GCD에서도 DispatchWorkItem을 사용하여 작업을 취소할 수 있는 형태로 구현할 수 있다.
- Swift Concurrency에서는 Task.checkCancellation() 등을 사용해 비동기 태스크 내에서 취소 상태를 확인할 수 있다.
요약
공통점 | GCD (Grand Central Dispatch) | Swift Concurrency (Async/Await) |
비동기 작업 처리 | DispatchQueue.async {} | async/await, Task |
멀티 스레딩 지원 | 다양한 DispatchQueue | Task 스케줄러 |
스레드 관리 자동화 | 자동으로 스레드 풀 관리 | Task 스케줄러로 자동 최적화 |
우선 순위 제어 | DispatchQoS | Task(priority:) |
작업 취소 지원 | DispatchWorkItem (부분적으로 지원) | Task.cancel(), Task.checkCancellation() |
특징 | GCD (Grand Central Dispatch) | Swift Concurrency (Async/Await) |
개념 | 스레드 풀을 사용해 작업을 비동기적으로 처리하기 위한 API. | Swift 5.5에서 도입된 구조화된 비동기 프로그래밍 모델. |
도입 시기 | iOS 4 | iOS 15, macOS 12 |
사용 방식 | 큐를 사용해 작업을 비동기적으로 추가하고, 콜백을 사용해 결과 처리. | async/await 키워드를 사용해 코드 흐름을 동기적으로 작성. |
코드 가독성 | 콜백 지옥 (Callback Hell) 발생 가능 | 코드 흐름이 동기 코드와 유사하여 가독성이 높음 |
성능 최적화 | 스레드 풀 관리, 우선순위 조정 등 수동으로 최적화 가능 | 시스템이 자동으로 최적화 (더 나은 스케줄링) |
에러 처리 | 콜백 내에서 수동으로 에러 처리 | do-catch 블록을 통한 구조화된 에러 처리 |
캔슬레이션 지원 | 수동으로 작업 취소 관리 | Task 객체를 통한 내장된 캔슬레이션 지원 |
메모리 관리 | 클로저 캡처에 주의해야 하며, weak self를 사용해 메모리 누수 방지 | async/await는 메모리 안전성을 자동으로 보장 |
주요 사용 사례 | 레거시 코드, iOS 14 이하 호환성 | 최신 iOS 프로젝트, 비동기 코드 리팩토링 |
GCD (Grand Central Dispatch) 샘플 코드
import UIKit
func fetchDataWithGCD() {
let url = URL(string: "https://www.apple.com")!
// 네트워크 요청을 백그라운드에서 수행하고, 메인 스레드에서 UI 업데이트를 수행
DispatchQueue.global(qos: .userInitiated).async {
// 클로저 내부에서 self를 캡처하기 때문에 메모리 누수 방지를 위해 [weak self]를 사용해야 한다.
guard let data = try? Data(contentsOf: url) else { return }
DispatchQueue.main.async {
print("Data fetched: \(data)")
}
}
}
fetchDataWithGCD()
Swift Concurrency (Async/Await) 샘플 코드
import Foundation
func fetchData() async {
let url = URL(string: "https://www.apple.com")!
do {
// async/await를 사용해 네트워크 요청을 수행하고 결과를 처리 (비동기 방식)
let (data, _) = try await URLSession.shared.data(from: url)
print("Data fetched: \(data)")
} catch {
print("Error fetching data: \(error)")
}
}
// Task를 생성하여 비동기 함수 호출
Task {
await fetchData()
}
iOS 15 이상을 타겟으로 하는 프로젝트에서는 Swift Concurrency (async/await)를 사용하는 것이 코드 가독성, 자동 메모리 관리, 에러 처리 등에서 GCD에 비해 이점이 있다.
반응형
'개발 > iOS' 카테고리의 다른 글
iOS 18 주요 추가 및 변경 사항 (0) | 2024.10.06 |
---|---|
[App Store Connect] 'NDEF is disallowed'. 에러 해결방법 (0) | 2024.10.04 |
UITextField, UITextView 입력 시 키보드창 가려짐 방지 (0) | 2024.05.14 |
UITextField 숫자 입력 시 콤마 추가 및 사용 (0) | 2024.05.14 |
Floating, Dragging Button (1) | 2024.01.04 |