Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

GCD (Grand Central Dispatch) 본문

Swift

GCD (Grand Central Dispatch)

JangJupyo 2024. 9. 25. 15:01
728x90
반응형

GCD(Grand Central Dispatch)는 멀티스레딩을 쉽게 처리할 수 있는 저수준 API로, 비동기동시성 처리를 효율적으로 구현할 수 있게 도와줍니다. GCD는 앱이 여러 작업을 동시에 처리하거나 특정 작업을 비동기적으로 실행하도록 지원합니다.

 

DispatchQueue

GCD에서 작업이 실행되는 큐를 DispatchQueue라고 하며, 이를 통해 작업을 직렬(Serial) 또는 병렬(Concurrent)로 처리할 수 있습니다.

  • Serial Queue: 작업을 하나씩 순차적으로 실행. 한 작업이 끝나야 다음 작업이 실행됩니다.
  • Concurrent Queue: 여러 작업을 동시에 실행. 완료 순서가 보장되지 않지만, 작업은 병렬로 실행됩니다.

 

동기(Synchronous)와 비동기(Asynchronous) 처리

  • 동기(Synchronous): 해당 작업이 완료될 때까지 현재 스레드는 대기하며, 작업이 끝난 후에야 다음 작업이 진행됩니다. 이는 sync 메서드를 사용해 구현합니다.
DispatchQueue.global().sync {
    // 이 작업이 완료될 때까지 기다림
    print("동기 작업 완료")
}
  • 비동기(Asynchronous): 작업을 실행한 후 즉시 다음 코드가 실행되며, 작업이 완료될 때까지 대기하지 않습니다. 비동기 초리는 async 메서드를 사용합니다.
DispatchQueue.global().async {
    // 백그라운드에서 비동기로 실행되는 작업
    print("비동기 작업 시작")
}

 

DispatchQueue의 종류

  • Main Queue: UI 업데이트나 사용자 상호작용 처리를 위한 큐입니다. 메인 스레드에서 실행되므로 UI 관련 작업은 이 큐에서 처리해야 합니다.
DispatchQueue.main.async {
    // 메인 스레드에서 UI 업데이트
    label.text = "Updated"
}
  • Global Queue: 백그라운드 작업을 처리하는 큐로, QoS(서비스 품질)을 설정할 수 있습니다. 예를 들어, 파일 다운로드나 이미지 처리와 같은 작업을 백그라운드에서 실행합니다.
DispatchQueue.global(qos: .background).async {
    // 백그라운드에서 비동기 작업 실행
    print("백그라운드 작업 완료")
}

 

QoS (Quality of Servie)

QoS는 작업의 우선순위를 설정하는 기능입니다. 시스템이 작업의 긴급성을 평가하여 자원을 더 많이 할당할지 덜 할당할지를 결정합니다.

  • userInteractive: UI와 관련된 작업으로 매우 빠르게 완료되어야 하는 작업.
  • userInitiated: 사용자 요청에 의해 발생한 작업으로 빠르게 처리되어야 하는 작업.
  • background: 백그라운드에서 실행되며, 완료까지 시간이 걸려도 괜찮은 작업.
DispatchQueue.global(qos: .userInitiated).async {
    // 중요한 사용자 요청 작업
    print("사용자 요청 작업 처리 중")
}

 

동기화 (Synchronization)

GCD는 여러 스레드에서 자원에 동시에 접근할 때 발생할 수 있는 경쟁 상태(Race Condition)를 방지할 수 있는 동기화 도구를 제공합니다. DispatchSemaphoreDispatchBarrier를 통해 동시성 문제를 해결할 수 있습니다.

  • DispatchSemaphore: 동기화를 위한 세마포어. 특정 작업이 완료될 때까지 다른 작업을 대기시킴.
let semaphore = DispatchSemaphore(value: 1)

DispatchQueue.global().async {
    semaphore.wait()    // 작업을 시작하기 전에 대기
    print("첫 번째 작업 실행 중")
    semaphore.signal()  // 작업 완료 후 신호를 보냄
}
  • DispatchBarrier: Concurrent Queue에서 특정 작업이 완료된 후 다음 작업이 실행되도록 강제합니다.
DispatchQueue.concurrentPerform(iterations: 10) { _ in
    DispatchQueue.global().async(flags: .barrier) {
        print("베리어 작업 실행")
    }
}

 

DispatchGroup

DispatchGroup을 사용하면 여러 비동기 작업을 그룹화해 모든 작업이 완료된 시점에 알림을 받을 수 있습니다. 여러 비동기 작업을 동시에 시작하고, 작업이 완료될 때 동작을 정의할 수 있습니다.

let dispatchGroup = DispatchGroup()

DispatchQueue.global().async(group: dispatchGroup) {
    print("작업 1 실행")
}

DispatchQueue.global().async(group: dispatchGroup) {
    print("작업 2 실행")
}

dispatchGroup.notify(queue: .main) {
    print("모든 작업 완료")
}

 

GCD는 멀티스레드 작업을 간소화하고 앱 성능을 최적화하는 중요한 도구입니다. DispatchQueue를 통해 직렬 및 병렬 작업을 제어하며, QoS 설정으로 작업 우선순위를 조정할 수 있습니다. DispatchGroup동기화 도구를 사용하여 여러 비동기 작업의 완료 시점을 처리하거나, 스레드 안전성을 유지하는 방식으로 앱의 동시성을 강화할 수 있습니다. GCD는 효율적인 멀티스레딩 처리에 필수적입니다.

반응형

'Swift' 카테고리의 다른 글

OperationQueue  (0) 2024.09.26
Concurrency (async/await)  (3) 2024.09.26
튜플 (Tuples)  (0) 2024.09.25
Announcing Swift 6  (2) 2024.09.23
옵셔널 (Optional)  (2) 2024.09.22