Dispatch Queue 살펴보기
iOS에서 멀티쓰레딩을 위해 가장 효율적인 방법으로 큐 라는 것이 이있습니다
DispatchQueue는 큐라는 이름에서 알 수 있듯이 FIFO구조의 작업 관리 객체입니다
메인 쓰레드 혹은 백그라운드 쓰레드에서 작업할 순서를 관리하며 순차 또는 동시에 처리하도록 지정할 수 있습니다
코드블럭을 Dispatch Queue에 넣어 Task를 정의합니다
DispatchQeue 타입
1) Serial
직렬이란 뜻 그대로 큐에 담긴 작업들은 순차적으로 처리합니다
한 순간에 하나의 작업만 처리하며 DiapatchQueue.main.async에서 봤던 main큐가 Serial타입입니다
main queue는 메인쓰레드와 연결된 Diapatch queue입니다
2) Concurrent
동시, 작업을 들어온 순서대로 동시에 처리할 수 있습니다
들어온 순서대로 일을 시작하지만 작업의 종료 순서는 보장되지 않습니다

3) Main dispatch queue
main쓰레드에 Task를 실행시키는 Serial큐로서 전역적으로 사용됩니다
이 큐는 앱의 실행루프(runloop)와 얽힌 이벤트 소스와 함께 사용되며 실행루프(runloop)가 모두 실행된 뒤 나머지 작업을 수행합니다
main, serial queue 실습
-main큐
print("1")
DispatchQueue.main.async {
print("1😀")
}
print("2")
DispatchQueue.main.async {
print("2😀")
}
print("3")
DispatchQueue.main.async {
print("3😀")
}
|
cs |
(main큐에 sync는 안되는 이유)
https://zeddios.tistory.com/519
결과

작업순서는 아래와 같습니다
"1" 출력
"1😀"출력 작업 main 큐에 담기
"2" 출력
"2😀"출력 작업 main 큐에 담기
"3" 출력
"3😀"출력 작업 main 큐에 담기
(runloop가 종료되었으니 큐에 담긴 순서대로)
"1😀 " 출력
"2😀 " 출력
"3😀 " 출력
-serial큐
serialQueue.async {
for i in 1...3{
print("\(i)😀")
}
}
serialQueue.async {
for i in 1...3{
print("\(i)👺")
}
}
for i in 90...120{
print(i)
}
|
cs |
작업순서
SerialQueue에 1~3 😀출력 작업 담기
SerialQueue에 1~3👺출력 작업 담기
90~120 출력
결과

SerialQueue에 담긴 작업들은 main큐와 다르게 실행루프와 독립적으로 실행되어
숫자가 출력되는 동안에 😀가 출력되며 😀출력이 끝나야 👺가 출력되는 것을 확인할 수 있었습니다
Concurrent queue 실습
let defaultQueue = DispatchQueue.global(qos: .default)
defaultQueue.async {
for i in 1...3{
print("\(i)😀")
}
}
defaultQueue.async {
for i in 1...3{
print("\(i)👺")
}
}
for i in 90...120{
print(i)
}
|
cs |
작업순서
defaultQueue에 1~3 😀출력 작업 담기
defaultQueue에 1~3👺출력 작업 담기
90~120 출력
실행결과

Concurrent타입의 큐는 Serial타입과 다르게 😀 👺 의 출력 순서가 일정하지 않습니다
큐에 들어온 순서대로 작업이 동시에 시작되는것을 알 수 있었습니다 또한 동시에 시작되더라도 작업이 끝나는 순서는 동일하지 않습니다
이번엔 Sync (동기)방식으로 작업을 큐에 넣어보겠습니다
let defaultQueue = DispatchQueue.global(qos: .userInitiated)
defaultQueue.sync {
for i in 1...3{
print("\(i)😀")
}
}
defaultQueue.sync {
for i in 1...3{
print("\(i)👺")
}
}
for i in 90...120{
print(i)
}
|
cs |
작업순서
defaultQueue에 1~3 😀출력 작업 담기
defaultQueue에 1~3👺출력 작업 담기
90~120 출력
실행결과

global큐는 Concurrence타입의 큐이지만 sync로 작업을 지시하면 작업이 들어온 순서대로 작업을 진행하며
Serial큐처럼 현재 작업이 끝날 때 까지 다음작업은 시작되지 않습니다..
저는 여기서 궁금증이 하나 생겨 테스트를 하나 더 진행해 보겠습니다
만약 async 비동기적으로 돌아가고 있던 작업이 있는데 중간에 sync 작업이 생긴다면 어떻게 될까??
let defaultQueue = DispatchQueue.global(qos: .userInitiated)
defaultQueue.async {
for i in 90...190{
print(i)
}
}
defaultQueue.sync {
for i in 1...3{
print("\(i)😀")
}
}
defaultQueue.sync {
for i in 1...3{
print("\(i)👺")
}
}
|
cs |
작업순서
defaultQueue에 90~190 출력 작업 담기
defaultQueue에 1~3 😀출력 작업 담기
defaultQueue에 1~3👺출력 작업 담기
결과

오 async로 돌고 있던 작업은 별다른 일 없이 하던 작업을 계속 하고 sync작업이 들어온 순간 다음작업은 시작되지 않았습니다!
참고문서
https://zeddios.tistory.com/516
iOS ) GCD - Dispatch Queue사용법 (1)
안녕하세요 :) Zedd입니다. ㅂㄷㅂㄷ 다시 쓰겠음 의 앞부분을 읽고오시면 도움이 될 것 같아요. GCD에 대한 개념?은 건너뛰고 사용법만 볼거라..그리고 글에서 문서를 그만읽는다고 했었는데, 문
zeddios.tistory.com
https://zeddios.tistory.com/513
iOS ) Concurrency Programming Guide - Dispatch Queues
안녕하세요 :) Zedd입니다. 오늘은 Concurrency Programming Guide의 Dispatch Queues부분을 해볼게요!! 드디어 익숙한게 나왔........거의 모두들 GCD를 쓰실텐데..... Dispatch Queues Grand Central Dispatch..
zeddios.tistory.com
https://furang-note.tistory.com/36
[iOS] GCD - DispatchQueue
GCD는 Grand Central Dispatch의 약자로 굳이 뜻 풀이를 하면 위엄있는 중앙의 파견이라는 뜻인데 우리나라의 국정원 같은 느낌이다. OS단에서 보내는, 그 누구도 중간에서 어떻게 하지 못하는 작업 정
furang-note.tistory.com
'🍎iOS프로그래밍 > 오늘의 공부' 카테고리의 다른 글
Mac - Source Tree 소스트리 강제종료 현상 (0) | 2022.07.16 |
---|---|
iOS - 디스패치큐 알아보기 - main, global(), private (0) | 2022.07.15 |
iOS - DispatchGroup알아보기 (0) | 2022.07.13 |
iOS - GCD(Grand Central Dispatch)알아보기 (0) | 2022.07.12 |
Swift - iOS앱 http 통신 허용하기 (0) | 2022.06.29 |
댓글