iOS/Swift

[Swift] GCD(Grand Central Dispatch)

HarryJeonn 2022. 11. 14. 13:03

GCD에 대해서 알아보자!

GCD

Thread 갯수, 코어 갯수, 동기/비동기화 같은 기능을 쉽게 접근하여 일을 처리하는 API

DispatchQueue

Queue에 담긴 각 아이템은 스레드 풀에 의해 처리된다.

1. Main

Main Thread에서 처리되는 Serial Queue

모든 UI 작업은 Main Queue에서 수행되어야 함

1-1. Global

전체 시스템에 공유되는 Concurrent Queue

QoS 파라미터 제공한다.

1-2. Custom

Serial Queue를 만들고 싶을 때 사용, Global Queue에서 실행된다.

2. Serial

이전 작업이 끝나면 다음 작업이 순차적으로 진행

2-1. Concurrent

병렬 형태로 진행

3. Sync

Queue에 집어넣은 데이터들이 끝날 때 까지 코드 진행이 멈춘다.

3-1. Async

Queue에 집어넣은 데이터들이 끝나지 않아도 코드가 진행된다.

DispatchQueue.main.async {
	// main thread, async
	// ...
}

DispatchQueue.global.sync {
	// global thread, sync
	// ...
}

DispatchQueue(label: "myQueue").async {
	// main thread, async
	// ...
}

4. asyncAfter

시간을 주고 그 시간 후에 해당 작업을 하라는 의미

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
	// ...
}

QoS (Quality of Service)

작업 시 우선 순위에 따라 처리하는데 이 중요도를 미리 정의한 개념이 QoS

어떤 작업을 Multi-threading으로 Concurrent하게 처리하고자 할 때 사용 (Global Queue)

QoS 우선 순위

  1. userInteractive
    • 유저 입장에서 가장 빠른 결과를 기대
    • 유저가 버튼을 tap할 시 바로 작동, Global Queue이지만 Main Thread에서 실행
  2. userInitiated
    • 유저 입장에서 조금 빠른 결과를 기대
    • Async하게 처리
  3. default
    • background에서 실행
  4. utility
    • 유저 입장에서 기다리는 정도의 기대
    • 계산, 입출력 등
  5. background
    • 유저 입장에서 실행되는지 몰라도 되는 정도의 바로 필요하지 않은 기대
  6. unspecified

정리

장점

  • OperationQueue에 비해 GCD가 가볍다.
  • 스레드 관리와 실행에 대한 책임을 애플리케이션 레벨에서 운영체제 레벨로 넘김
  • 스레드를 직접 생성하고 관리하는 것에 비해 관리 용이, 성능 향상

동작 방식

  • 앱을 실행하면 시스템이 자동으로 메인스레드 위에서 동작하는 Main Queue(Serial Queue)를 만들어서 작업을 수행, 그 외에 여러개의 Global Queue(Cuncurrent Queue)를 추가적으로 만들어서 관리

Queue 종류

  • Dispatch Queues
    • FIFO 순서로 작업을 실행시키는 역할을 담당
  • Serial Dispatch Queue
    • 한번에 한 작업만 실행
  • Concurrent Dispatch Queue
    • 시작한 작업이 끝나는 것을 기다리지 않고 많은 작업을 실행
  • Main Dispatch Queue
    • 메인 스레드에서 작업을 실행할 수 있는 전역에서 사용 가능한 Serial Queue
  • DispatchQueue.main
    • Main thread queue, Serial queue로 동작

🧐

어째서일까.. 비동기적으로 처리해야할 때는 Global Queue를 사용했고, 그걸 UI 업데이트하려고 할 때는 Main Queue에서 당연하게 사용했던 것 같다.

요즘 다시 복습하는 겸 정리를 할수록 구현하기 위해서 사용했지 제대로 이해하지 못한 것이 많은 것 같다.

이제라도 알았으니 다음부터는 더 알고 쓰자!