일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- GCD
- 스트럭트
- ios
- 네트워크
- 이론
- CS
- async
- 옵셔널
- swift
- RxSwift
- 토이프로젝트
- struct
- SwiftUI
- MVVM
- WeatherKit
- uikit
- collectionview
- 기초문법
- mvc
- Optional
- 동시성
- 학과별커뮤니티
- 대표
- 세종대학교
- 반응형
- Kingfisher
- 프로토콜
- 구름톤 유니브
- 앱개발
- 실습
- Today
- Total
스윞한 개발자
Swift - GCD 본문
안녕하세요! 오랜만에 포스팅을 해보는데요!
프로젝트도 하고 해커톤도 하느라 부랴부랴 바쁜 일정을 보내고 있습니다
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
이렇게 프로젝트도 하고 대회도 나가면서 제가 깨달은 게 있는데요.. 기초를 탄탄히 하는 게 참 중요한 거 같아요!
사실 예전에는 구글링도 많이하고 블로그나 GPT에게 많이 물어봤는데요! 이게 제일 안 좋은 습관인 거 같아요.
그래서 요즘 책이랑 공식문서를 읽어보며 처음부터 다시 차근차근 공부하고 있답니다!
그래서 뜸했던 이론 공부를 하며 다시 열심히 기록해보려고 합니다!
오늘 기록할 이론은 IOS GCD 입니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif)
https://developer.apple.com/documentation/DISPATCH
Dispatch | Apple Developer Documentation
Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.
developer.apple.com
* GCD
"GCD(Grand Central Dispatch)"라고 알려진 Dispatch에는 macOS, iOS, watchOS 및 tvOS의 멀티코어 하드웨어에 대한 동시 코드 실행 지원에 대한 체계적이고 포괄적인 개선 사항을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 개선 사항이 포함되어 있습니다!
시스템과 응용 프로그램이 모두 더 빠르고 효율적이며 향상된 응답성을 갖도록 합니다. -> 시스템 수준에서 작동하는 GCD는 실행 중인 모든 애플리케이션의 요구 사항을 더 잘 수용하여 사용 가능한 시스템 리소스에 균형 잡힌 방식으로 일치시킬 수 있습니다.
즉, GCD는 iOS에서 멀티코어 프로세서에 코드를 동시에 실행시키게 해주는 프레임워크입니다.
Queues and Tasks"
1. class DispatchQueue : 앱의 기본, 백그라운드 스레드에서 작업의 순차적 or 동시 실행을 관리하는 객체
2. class DispatchWorkItem : *수행하려는 작업은 완료핸들이나 실행 종속성을 연결할 수 있는 방식으로 캡슐화
3. class DispatchGroup : 단일 단위로 모니터링하는 작업 그룹
* Workloop : 서비스 품질(QoS) 수준을 기반으로 작업 실행의 우선순위를 지정하는 디스패치 객체
GCD의 대기열 및 작업을 나열하면 위와 같이 나와있습니다! 단순히 저렇게만 보면 무슨 소린지... 차근차근 정리해 볼게요!
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/012.gif)
# DispatchQueue
: 앱의 기본, 백그라운드 스레드에서 작업의 순차적 or 동시 실행을 관리하는 객체
DispatchQueue는 애플리케이션이 블록 객체 형태로 작업을 할 수 있는 First In First Out(선입선출)큐입니다. DispatchQueue는 작업을 순차적으로 or 동시에 실행합니다. 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다. 앱의 메인 스레드를 나타내는 DispatchQueue를 제외하고 시스템은 작업을 실행하는 데 다양한 스레드를 사용합니다.(알 수X)
작업 항목들을 동기식, 비동기식으로 예약하고 실행합니다.
- 작업항목을 동기적으로 예약할 경우 : 해당 항목의 실행이 완료될 때까지 코드가 대기
- 작업항목을 비동기적으로 예약할 경우 : 작업 항목이 다른 곳에서 실행되는 동안 코드가 계속 실행
**중요 : 기본 대기열에서 작업 항목을 동기적으로 실행하려 시도하면 -> 교착상태 발생
동시 실행을 위한 작업을 할 때 현재 실행 스레드를 차단하는 메서드 호출 X
동시 디스패치 대기열에 의해 예약된 작업이 스레드를 차단하게 된다면 시스템은 대기열에 있는 다른 동시 작업을 수행하기 위해 추가 스레드를 생성합니다. 너무 많은 작업이 차단되면 시스템에서 앱 스레드 부족현상이 발생하게 됩니다!!
즉, 동시 DispatchQueue를 너무 많이 만들게 된다면 DispatchQueue는 스레드 리소스를 소비하기 때문에 스레드 소비 문제가 악화됩니다. 개인 동시 대기열을 만드는 대신 글로벌 동시 DispatchQueue 중 하나를 사용(직렬 작업의 경우)하시면 됩니다!
이제 DispatchQueue의 Property에 대해서 간략하게 알아보겠습니다!
main : 현재 프로세스의 기본 스레드와 연결된 디스패치 큐
시스템에서 자동으로 메인 큐를 생성하고 이를 애플리케이션의 메인 스레드와 연결합니다.
https://developer.apple.com/documentation/dispatch/dispatchqueue/1781006-main
main | Apple Developer Documentation
The dispatch queue associated with the main thread of the current process.
developer.apple.com
*중요 : 메인 스레드가 너무 오랫동안 응답하지 않으면 예외가 발생할 수 있음! iOS에서는 앱이 특정 사용자 인터페이스 이벤트에 적시에 응답하지 못한 것을 감시 메커니즘이 감지하면 이와 같은 예외가 발생할 수 있습니다.(Watchdog)
-->> 앱의 네트워크 호출과 같이 오랫동안 실행되는 작업이 있는 경우 전역 시스템큐 사용!
또한 스레드 없이 그대로의 코드를 실행하는 것은 Main Queue에서 동기적으로 실행하겠다는 것과 같은 의미이기 때문에 *DispatchQueue.main.sync{}는 사용할 수 없습니다.
*DispatchQueue.main.async{} -> 비동기적으로 main 스레드에 보내는 것은 사용가능합니다.
2. global(qos:) : 지정된 서비스 클래스를 사용하여 전역 시스템 대기열을 반환
Concurrent(동시) : 반환된 대기열에 제출된 작업은 서로 동시에 예약됩니다.
qos : 대기열과 연결할 서비스 품질 수준. 작업 실행을 예약하는 우선순위(중요한 순)를 결정합니다.(6개)
userInteractive, userInitiated, default, utility, background, unspecified
// 유저와 직접 인터렉티브 : UI관련 (즉시)
DispatchQueue.global(qos: .userInteractive)
// 반드시 필요, 비동기 처리 : 앱 내에서 첨부파일을 열기, 내부 데이터베이스 조회 등 (몇초)
DispatchQueue.global(qos: .userInitiated)
// 일반적인 작업
DispatchQueue.global()
// ProgressIndicator와 함께 길게 사용되는 작업 : 지속적인 데이터 feed, Networking (몇초~몇분)
DispatchQueue.global(qos: .utility)
// 사용자가 직접적으로 인지하지 않는 부분 : 데이터베이스 유지 등 (속도보다는 에너지 효율성 중시)
DispatchQueue.global(qos: .background)
// 사용하지 않음 legacy API
DispatchQueue.global(qos: .unspecified)
>> 작업 스레드에 배치하는 일은 운영체제가 알아서 처리합니다. 우선순위가 더 높은 작업은 우선적으로 더 많은 스레드에 배치하고 배터리를 집중적으로 소모하게 됩니다.
**DispatchQueue 주의사항
1. UI관련 작업은 모두 Main Queue에서 담당
DispatchQueue.global().async {
// (비동기 네트워크 작업) 이미지 다운로드
...
DispatchQueue.main.async {
// (UI관련) 다운로드한 이미지를 화면에 표시
{
}
2. 메인 큐에서 다른 큐로 보낼 때 sync(동기)를 사용 불가
다른 스레드에서 작업하는 이유는 메인에서 UI관련 작업을 하는 동안 동시적으로 수행하여 속도 향상을 위함인데 sync를 사용하면 해당 작업이 끝날 때까지 메인 스레드를 차단하기 때문에 앱의 속도가 저하됩니다.
3. 현재 큐에서 같은 큐로 sync를 사용 불가
실행 중이던 스레드는 차단 상태가 됩니다. 교착상태가 발생하게 됩니다.
참고
https://tngusmiso.tistory.com/49
[iOS] 디스패치큐(GCD)의 종류와 특징, 그리고 주의사항
DispatchQueue(GCD)의 종류 1. main queue : Serial 2. global queue : Concurrent / QoS 설정 3. private queue : 디폴트 Serial (Concurrent로 변경 가능) / QoS 추론 Main Queue DispatchQueue.main - 한개만 존재 => Main Thread에서 동작 - Seri
tngusmiso.tistory.com
# DispatchWorkItem
: 수행하려는 작업은 완료핸들이나 실행 종속성을 연결할 수 있는 방식으로 캡슐화
https://developer.apple.com/documentation/dispatch/dispatchworkitem
DispatchWorkItem | Apple Developer Documentation
The work you want to perform, encapsulated in a way that lets you attach a completion handle or execution dependencies.
developer.apple.com
즉, 디스패치 큐, 디스패치 그룹 내에서 수행될 작업을 캡슐화합니다. 작업항목을 DispatchSource 이벤트, 등록 또는 취소 처리기로 사용할 수 있습니다.
*DispatchSource : 파일 시스템 이벤트, 타이머 및 UNIX 신호와 같은 특정 하위 수준 시스템 이벤트의 처리를 조정하는 개체입니다.
# DispatchGroup
: 단일 단위로 모니터링하는 작업 그룹
https://developer.apple.com/documentation/dispatch/dispatchgroup
DispatchGroup | Apple Developer Documentation
A group of tasks that you monitor as a single unit.
developer.apple.com
그룹을 사용하면 일련의 작업을 집계하고 그룹의 동작을 동기화할 수 있습니다. 여러 작업 항목을 그룹에 연결하고 동일한 큐 또는 다른 큐에서 비동기 실행되도록 예약합니다. 모든 작업 항목의 실행이 완료되면 그룹은 컴플리션 핸들러를 실행해서 알려줍니다.
하나하나 적다 보니 양이 많아지고 길어졌는데요..! 아직 다 찾아서 정리하지 못했다는 점..!
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/012.gif)
이번 포스팅은 이 정도로 GCD에 대해 알아본 것으로 마무리하겠습니다! 긴 글 읽어주셔서 감사합니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/020.gif)
'Swift 이론' 카테고리의 다른 글
Swift - WMO 전체 모듈 최적화 (0) | 2024.04.11 |
---|---|
Swift - Concurrency (0) | 2024.04.11 |
Swift - MVC to MVVM 개념정리/클린아키텍쳐(Swift UIkit Fundamental) (0) | 2024.02.06 |
IOS - UICollectionView (4) | 2024.01.30 |
SwiftUI의 Property Wrappers (0) | 2024.01.29 |