🍎 iOS/GCD

[iOS/GCD] 2. GCD의 개념 및 종류

dev_zoe 2023. 3. 10. 19:17
반응형

Swift로 동시성 프로그래밍을 구현하는 방법은 GCD, Operaion, async/await이 있다.

여기서는 GCD, DispatchQueue에 대해 알아보도록 하겠다.

(혹시 틀린 정보가 있으면 댓글로 알려주시면 감사하겠습니다!)

Dispatch(=GCD)란?

*공식문서 링크: https://developer.apple.com/documentation/dispatch

- 멀티코어 하드웨어에서 코드가 동시에 실행되도록 자동으로! iOS에서 관리해주는 시스템

- GCD는 응용 프로그램 각각을 자동으로 효율적으로 자원을 사용하도록 분배해준다.

 

DispatchQueue란?

*공식문서 링크 : https://developer.apple.com/documentation/dispatch/dispatchqueue/

- DispatchQueue는 '대기열에 보내다' 라는 뜻! Queue는 자료구조의 큐와 같이 선입선출 (FIFO) 구조임

- DispatchQueue는 GCD를 사용하기 위한 대기열로, GCD 기술의 일부임 (Dispatch가 더 큰 개념임)

- 우리는 이 대기열 들에 작업을 추가해주기만 하면 시스템은 알아서 스레드를 관리하여 작업을 처리하도록 도와줌

 

우리는 다음을 정해서 큐에 보내기만 하면 애플이 알아서 관리해준다.

 

1) 단일 스레드를 사용할 것인가, 다중 스레드를 사용할 것인가(Serial/Concurrent)?

2) 그리고 동기로 작업을 처리할 것인가, 비동기로 작업을 처리할 것인가(sync/async)?

 

큐의 종류

Main (DispatchQueue.main)

- 앱의 기본이 되는 스레드로서, 모든 앱은 반드시 최소 하나 이상의 스레드가 필요하며 해당 스레드가 바로 메인 스레드임

항상 메모리에 올라와있는 기본 스레드이며, 생명주기를 가짐

Serial Queue이기 때문에, 메인 스레드만 사용할 경우 동시에 여러 작업을 처리할 수 없음

 

Global

- 메인 스레드 위에서 발생한 별도의 스레드임 (필수적으로 있어야하는 스레드 X)

Concurrent Queue이기 때문에, 메인 스레드위에서 별도의 스레드가 파생되어 만들어져 그 위에서 작업을 동시에 처리할 수 있음

- global() 이 호출되면 작업을 처리하기 위해 잠시 메모리에 올라왔다가, 작업이 끝나면 메모리에서 제거됨

- QoS  (큐의 서비스 품질) 6종류에 따라서 시스템이 우선순위에 따라 더 많은 스레드에 작업을 배치할 수 있도록 함 

// 동기, sync
DispatchQueue.main.sync {}
DispatchQueue.global().sync {}

// 비동기, async
DispatchQueue.main.async {}
DispatchQueue.global().async {}

 

✨ 자주쓰는 QoS 6가지 중 3개

1) .userInteractive: 사용자에게 즉시 보여져야 하는 경우 -> UI 업데이트/애니메이션 등

2) .userInitiated: 유저가 즉시 필요하기는 하지만 비동기적으로 처리되는 작업 -> 로컬 데이터베이스를 읽는 경우

3) 디폴트(qos를 지정 안하는 경우): 일반적인 작업

 

Custom

- label로 커스텀으로 만드는 큐이며, DispatchQueue(label:"...")에서 attributes를 따로 .concurrent로 설정하지 않으면 기본값은 Serial

DispatchQueue(label: "...") // 직렬
DispatchQueue(label: "...", attributes: .concurrent) //동시

실제로 각각 코드가 어떻게 돌아가는지는 아래 블로그 링크 예시를 보면

 

https://zeddios.tistory.com/516

 

iOS ) GCD - Dispatch Queue사용법 (1)

안녕하세요 :) Zedd입니다.ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문서

zeddios.tistory.com

 

global().sync : 동기적 처리 -> 차례대로 실행

global().async : 비동기적 처리 -> 뒤죽박죽 실행 (스레드에게 각각 작업을 할당받아 각각 실행되기 때문에 어떤 프린트문이 실행될지 모름)

main.sync / main.async : 메인스레드는 단 1개가 존재하므로 sync와 async 결과 모두 같다.

- 그리고 이 절차를 꼭 거치지 않아도 디폴트로 메인스레드로 실행하기 때문에 특별한 경우에만 실행한다고 함 (알게되면 수정 예정)

 

reference

앨런 Swift 문법 마스터스쿨

원티드 프리온보딩 동시성 강의

야곰닷넷 - 동시성 프로그래밍

반응형