티스토리 뷰
Dispatch Queue를 사용하면서 GCD를 한번쯤은 들어보셨을 겁니다.
이번엔 GCD/ Dispatch Queue에 대해 알아보겠습니다.
GCD
Dispatch, also known as Grand Central Dispatch (GCD), contains language features, runtime libraries, and system enhancements that provide systemic, comprehensive improvements to the support for concurrent code execution on multicore hardware in macOS, iOS, watchOS, and tvOS.
공식 문서를 보면 이렇게 써있습니다.
GCD는 멀티 코어 시스템에서 동시 코드 실행을 지원하기 위해 체계적이고 포괄적인 개선을 제공하는 언어 기능, 런타임 라이브러리 및 시스템 향상을 포함한다.
GCD의 장점
- 코드 단순화
- 스레드 관련 코드 삭제
- 스레드 스택 저장을 위한 페널티 감소
이정도가 될 수 있겠네요
DispatchQueue
dispatch queues를 사용하면 비동기/ 동기 방식으로 임의의 코드 블록을 수행할 수 있습니다.
그니까 Dispatch Queue를 사용하면 개발자가 스레드를 각각 관리하지 않고 작업을 정의해서 Dispatch Queue에 넣어만 주면 알아서 실행해주는 거죠 참 간편한 기능이죠?
DispatchQueue의 사용법에 대해 알아보겠습니다
DispatchQueue에는 두가지 종류가 있습니다
Serial
Concurrent
Serial은 하나의 작업이 끝나야 다음 작업이 시작되는 queue입니다
Concurrent는 동시에 여러 작업들이 실행되는 queue입니다. 동시에 여러 작업들이 실행된다고 순서 없이 되는게 아니라 queue니까 순서대로 실행된다고 하네요
Cocoa Application은 미리 만들어진 2가지 queue를 제공합니다 흔히 사용하던 main과 global이죠
먼저 main을 볼게요!
main dispatch queue는 앱의 main 스레드에서 task를 실행하는 serial queue입니다. Main Queue는 메인 스레드에서 동작하기 때문에 단 하나만 존재하고 큐에 들어오는 작업을 순차적으로 실행합니다. 그리고 중요한 역할이 있는데 UI를 담당하는 것입니다.
그래서 main dispatch queue에는 UI 관련된 task만 넣어야만 한다고 합니다. 왜??
-> main dispatch queue는 serial이니까 이전 task가 끝나야 다음 task가 실행되잖아요 그런데 main task에 UI관련이 아닌 파일 다운로드, 업로드 요런게 들어가면 사용자 입장에서 앱이 멈췄다고 생각할테니 main dispatch queue에는 UI 관련 task만 넣어야 한다고 알고있습니다
다음은 global queue입니다.
global dispatch queue는 동시에 하나 이상의 task를 실행합니다.
global dispatch queue에는 파라미터로 qos라는게 들어갑니다. qos란? Quality of Service란 뜻으로 중요도로 보면 됩니다. 요걸로 task의 우선순위를 정하는 것이죠
qos에는
- userInteractive - 진짜 중요 지금 당장 해야함
- userInitiated - 거의 바로 해줘야 함. 사용자가 기다림
- defailt: 디폴트
- utility: 시간이 좀 걸리는 일들. 사용자가 당당 기다리지 않는 task
- background : 사용자한테 당장 인식될 필요가 없는것들
이렇게 다양한 종류가 있습니다
DispatchQueue.global(qos: .userInitiated).async {
//code
}
이런 식으로 QoS를 적절하게 지정해주면 앱의 효율이 좋아진다네요!!!
그리고 custom Queue를 만들 수도 있긴합니다
let concurrentQueue = DispatchQueue(label: "concurrent", qos: .background, attributes: .concurrent)
let serialtQueue = DispatchQueue(label: "serial", qos: .background)
요런 식으로 말이죠
snyc, async
Sync는 큐에 작업을 등록한 이후에 해당 task가 완료될 때 까지 코드를 실행지 않고 기다립니다.
Async는 큐에 task를 등록한 이후에도 다른 코드를 실행합니다
serial, concurrent 모두 sync, async 둘다 사용할 수 있습니다.
저도 처음 볼때 헷갈렸는데요 concurrent, serial은 큐에 들어온 task를 어떻게 처리하냐에 대한 문제였고
sync, async는 Dispatch Queue에 task를 등록하는 주체에 대한 문제입니다
main.sync는 안됩니다@!
Main DispatchQueue에서 snyc를 사용하면 메인 스레드는 그대로 진행을 멈추고 등록한 작업이 끝날때까지 기다리게 됩니다. 그리고 큐에 등록돤 task는 메인 스레드에 할당됩니다. 그런데 메인 스레드는 이미 아무것도 못하는 상태이기 때문에 작업을 수행할 수 없고 결국 데드락(deadlock)상태에 빠지게 됩니다
sync, async에 대한 예시는
https://zeddios.tistory.com/516
iOS ) GCD - Dispatch Queue사용법 (1)
안녕하세요 :) Zedd입니다.ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문서
zeddios.tistory.com
제드님이 보기 좋게 정리해 놓으셨더라구요
가서 보시는거 추천드립니다
참고
https://developer.apple.com/documentation/dispatch/dispatchqueue
Apple Developer Documentation
developer.apple.com
https://zeddios.tistory.com/516
iOS ) GCD - Dispatch Queue사용법 (1)
안녕하세요 :) Zedd입니다.ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문서
zeddios.tistory.com
https://jeonyeohun.tistory.com/279
[Swift] GCD(Grand Central Dispatch) - Dispatch Queue
GCD(Grand Central Dispatch)랑 Dispatch Queue랑 같은거야? 이 포스트를 준비하면서 "우리는 왜 Dispatch Queue를 GCD라고 할까?"라는 의문이 먼저 들었습니다. 그래서 공식문서를 찾아보니 GCD와 Dispatch Queue는 내
jeonyeohun.tistory.com
'iOS' 카테고리의 다른 글
iOS command phasescriptexecution failed with a nonzero exit code 오류 (0) | 2023.05.24 |
---|---|
iOS) applicationWillResignActive가 호출되지 않을 때 (0) | 2023.01.12 |
iOS) UIImage, UIImageView (0) | 2023.01.01 |
iOS) About dequeueReusableCell (0) | 2022.12.06 |
MVVM(Model, View, ViewModel) pattern (0) | 2022.08.10 |
- Total
- Today
- Yesterday
- C++
- 마법사 상어와 파이어스톰
- Algorithm
- 알고리즘
- swea
- ios
- 도둑질
- programmers
- 3차원 농부
- 8898
- Xcode
- 3000
- 코테
- UIKit
- 코딩테스트
- swift
- 문자열 교집합
- 입국심사
- 단속카메라
- 백준 20058
- programmres
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |