반응형

두가지 모두 비동기 프로그래밍을 위해 사용되는 기술로, 멀티 스레딩 및 동시성 처리를 할때 사용된다.

두 기술에 대한 비교는 다음과 같다.

 

  1. 비동기 작업 처리:
    • 두 기술 모두 비동기적으로 작업을 수행할 수 있다. 이를 통해 메인 스레드가 블로킹되지 않으며, 사용자 인터페이스가 멈추지 않게 할 수 있다.
  2. 멀티 스레딩 지원:
    • GCD는 작업을 비동기적으로 다양한 큐에서 실행하고, Swift Concurrency는 태스크를 사용하여 비동기 코드를 스케줄링한다.
    • 둘 다 멀티코어 CPU의 성능을 활용해 병렬 처리가 가능하다.
  3. 스레드 관리 자동화:
    • GCD는 스레드 풀을 관리하여 시스템 리소스를 효율적으로 사용한다.
    • Swift Concurrency도 내부적으로 Task Scheduler를 사용하여 스레드 관리와 태스크 스케줄링을 자동으로 최적화한다.
  4. QoS (Quality of Service):
    • 두 기술 모두 작업의 우선 순위를 지정할 수 있습니다.
      • GCD에서는 DispatchQoS를 사용해 작업 우선 순위를 설정한다.
      • Swift Concurrency에서는 Task의 우선 순위를 조정할 수 있다 (Task(priority: .high) 등).
  5. 캔슬 가능한 작업:
    • 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에 비해 이점이 있다.

 

반응형
블로그 이미지

SKY STORY

,