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
global().sync : 동기적 처리 -> 차례대로 실행
global().async : 비동기적 처리 -> 뒤죽박죽 실행 (스레드에게 각각 작업을 할당받아 각각 실행되기 때문에 어떤 프린트문이 실행될지 모름)
main.sync / main.async : 메인스레드는 단 1개가 존재하므로 sync와 async 결과 모두 같다.
- 그리고 이 절차를 꼭 거치지 않아도 디폴트로 메인스레드로 실행하기 때문에 특별한 경우에만 실행한다고 함 (알게되면 수정 예정)
reference
'🍎 iOS > GCD' 카테고리의 다른 글
[iOS/GCD] 4. async/await (Swift 5.5 ~) (feat. vs Combine, RxSwift) (0) | 2023.07.24 |
---|---|
[iOS/GCD] 3. GCD의 주의사항 (0) | 2023.07.23 |
[iOS/GCD] 1. 코어/스레드/프로세스, 직렬/병렬/동시, 동기/비동기 (0) | 2023.03.10 |