본문 바로가기
🍎iOS프로그래밍/오늘의 공부

iOS - DispatchQueue 알아보기

by 둥둥동동# 2022. 7. 14.
728x90

 

Dispatch Queue 살펴보기

 

iOS에서 멀티쓰레딩을 위해 가장 효율적인 방법으로 큐 라는 것이 이있습니다

DispatchQueue는 큐라는 이름에서 알 수 있듯이 FIFO구조의 작업 관리 객체입니다

메인 쓰레드 혹은 백그라운드 쓰레드에서 작업할 순서를 관리하며 순차 또는 동시에 처리하도록 지정할 수 있습니다

코드블럭을 Dispatch Queue에 넣어 Task를 정의합니다

 

 

DispatchQeue 타입

 

1) Serial 

 

직렬이란 뜻 그대로 큐에 담긴 작업들은 순차적으로 처리합니다

한 순간에 하나의 작업만 처리하며 DiapatchQueue.main.async에서 봤던 main큐가 Serial타입입니다

main queue는 메인쓰레드와 연결된 Diapatch queue입니다

 

 

2) Concurrent

 

동시, 작업을 들어온 순서대로 동시에 처리할 수 있습니다

들어온 순서대로 일을 시작하지만 작업의 종료 순서는 보장되지 않습니다

https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1

 

 

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

 

728x90

댓글