[Concurrency] Swift 비동기 처리방식
Concurrency
Swift 5.5 이후 async, await, task 개념들이 등장하였다. 기존의 동시성 프로그래밍을 할때는 여러 스레드를 한꺼번에 사용하여 Thread Safe하지 않은 코드를 작성할 잠재적인 가능성이 있고 디버깅하기 어려웠다.
Swift6의 목표는 컴파일 시점에 Thread Safe한 코드를 작성하기 위한 최적의 솔루션 제공을 목적으로 한다.
공식문서
📝 Swift 비동기 처리방식
1. NSThread
- Object-C 시절부터 사용되었다
- 직접 스레드를 셍성하고 괸리해야 한다.
- 수동으로 동기화 해야하다.
- GCD나 OperationQueue에 비해 사용성이 떨어진다.
-
❌ 현재 사용 여부: 현재 거의 사용되지 않는다.
let thread = Thread { print("Background 작업 실행") } thread.start()
2. OperationQueue (iOS 2.0/2008)
- GCD보다 객체 지향적이고 세밀한 제어 가능하다.
- 여러 작업을 동시에 실행 가능하다.
- 의존성(Dependency) 설절 가능하다.
-
✅ 현재 사용 여부: 여러 작업 간 의존성이 있는 경우 사용된다.
let queue = OperationQueue() let operation = BlockOperation { print("Background 작업 실행") } queue.addOperation(operation)
3. GCD(Grand Central Dispatch) (iOS 4.0/2010)
- 백그라운드 실행이 간편하다.
- 성능 최적화된 C 기반 API이다.
- 메인 스레드에서 UI 업데이트 가능하다.
-
✅ 현재 사용 여부: 많이 사용된다. (백그라운드 처리, UI 업데이트)
DispatchQueue.gloal(qos: .background).async { // Background 작업 실행 let result = heavyTask() DispatchQueue.main.async { updateUI(with: result) } }
4. RxSwift (ReactiveX)
- 오픈소스 라이브러리이다.
- 리액티브 프로그래밍을 위한 강력한 프레임워크다.
- 비동기 데이터 스트림을 선언적으로 처리 가능하다.
- Obserable과 Observer 패턴 사용한다.
-
✅ 현재 사용 여부: 많이 사용된다. (MVVM 아키텍쳐에서 활용됨)
import RxSwift let disposeBag = DisposeBag() let observable = Observable.just("Background 작업 실행") observable.subscribe(onNext: { value in print(value) }).disposed(by: disposeBag)
5. Combine (iOS 13.0/2019)
- 리액티브 프로그래밍 프레임워크이다.
- 데이터 스트림을 다룰 때 유용하다.
- Publisher와 Subscriber 패턴을 사용한다.
-
✅ 현재 사용 여부: 특정 상황에서 사용된다. (API 응답, 데이터 스트림 처리 등)
import Combine let publisher = Just("Background 작업 실행") let cancellable = publisher.sink { value in print(value) }
6. Async/await (Switt Concurrency) (iOS 15.0/2021/Swift5.5)
- 가독성이 뛰어난 최신 비동기 처리 방식이다.
- 동기 코드처럼 작성 가능하다
- Task를 활용해 SwiftUI에서도 사용 가능하다.
- ✅ 현재 사용 여부: 가장 추천되는 방식이다. (Swift 5.5+ 환경에서 최적의 선택)
func fetchData() async -> String { // Background 작업 실행 try await Task.sleep(nanoseconds: 1_000_000_000) // 1초 대기 return "Fetched Data" } Task { let data = await fetchData() print(data) }
✅ 정리 (비동기 처리 방식 비교)
도입 순서 | 비동기 방식 | 특징 | 현재 사용 여부 |
---|---|---|---|
1 | NSThread |
직접 스레드 관리, 수동 동기화 필요 | 거의 안 씀 ❌ |
2 | OperationQueue |
객체 지향적, 작업 의존성 설정 가능 | 사용됨 ✅ |
3 | GCD (DispatchQueue) |
백그라운드 처리, UI 업데이트 가능 | 많이 사용됨 ✅ |
4 | RxSwift |
리액티브 프로그래밍, Observable 활용 | 많이 사용됨 ✅ |
5 | Combine |
데이터 스트림을 다루는 리액티브 프로그래밍 | 특정 상황에서 사용됨 ✅ |
6 | async/await |
최신 Swift 비동기 처리 방식, 가독성이 좋음 | 가장 추천됨 🚀✅ |
Leave a comment