본문 바로가기

개발/Swift

[Swift] DispatchQueue 종류

반응형

iOS에서 멀티스레딩은 큐를 이용해 작동한다.

iOS 멀티스레딩 큐에는 코드 블럭들이 들어있다. 이 큐에 집어넣는 것은 거의 대부분 클로저다.
큐는 여러 개고 다양한 종류들이 있다. 이 큐에는 실행 스레드를 가진 시스템이 접근한다.
이 스레드들은 병렬로 작동할 수 있다. 

우선 큐에 대해 알아보자.
직렬큐 (Serial Queue)병렬큐 (Concurrent Queue) 2가지가 있다.

직렬(Serial)큐는 iOS가 큐에서 하나를 꺼내고, 해당 작업이 완료될 때까지 실행시킨다.
그럼 다시 큐로 돌아와 다른 하나를 꺼내어 실행시킨다.

병렬(Concurrent)큐는 iOS가 큐에서 하나를 꺼내고 실행시킨다.
iOS가 사용 가능한 다른 스레드가 있다면,
큐에 접근해서 스레드를 꺼내 실행시키는데 이는 그 전의 작업이 끝나기 전에 이루어질 수 있다.
이런 식으로 여러개의 작업을 같은 큐에서 꺼내어 동시에 실행시킬 수 있다.

 

메인큐(Main Queue)와 글로벌 큐(Global Queue)

UI가 막히지 않게 하기 위해서는 이 두 종류를 잘 알고 있어야한다.
UI는 싱글 직렬큐에서 실행되는데 이를 메인큐(Main Queue)라고 한다.
이 큐에서 UI가 실행될 뿐만 아니라 UI를 위해 실행되는 코드 블록은 오직 메인큐에만 저장된다.
따라서 UI와 관련된 모든 것들은 여기에 저장한다. 직렬큐이기 때문에 모두 하나의 스레드에서 실행된다.

큐가 작동되는 방식은 터치 이벤트 이후부터다.
터치 이벤트가 일어나면 이를 처리하고 어떤 코드가 실행되야할지 알아내어 코드를 실행시킨다.
메인 큐는 메인 스레드에서 실행되니 가능한 다른 것들은 메인 큐에서 제외해야한다.

그럼 네트워크 작업과 같은 코드는 어디에 넣어야할까?
글로벌 큐(Global Queue)에 집어 넣으면 된다.
글로벌 큐는 4가지가 있는데 이 글에서는 하나를 사용할 것이다.
그 큐들은 병행큐인데 실행할 코드를 넣으면 시스템이 접근해 이를 실행시킬 것이다.
여기에는 어떤 코드라도 상관 없으나 UI와 관련된 코드만 아니면 된다.

// 메인 큐
let mainQueue = DispatchQueue.nain

// 글로벌 큐
let backgroundQueue = DispatchQueue.global(qos: DispatchQoS)
// 글로벌 큐의 4가지 큐
DispatchQoS.userInteractive
DispatchQoS.userInitiated
DispatchQoS.background
DispatchQoS.utility

 

  • DispatchQoS.userInteractive
    • 거의 사용하지 않는다.
    • 사용자가 화면에서 드래그나 축소 등의 동작을 하는 중간에 메인 큐가 아닌 다른 큐에서 빠르게 처리하고
      동작 중간- 다시 메인 큐로 돌아오기를 원할 때 이 큐를 사용한다.
    • 매우 작고 빠르게 실행되는 작업이라 이는 메인 큐에서 처리하는 경우가 대부분이다.
  • DispatchQoS.userInitiated
    • 가장 흔하게 사용된다.
    • 사용자가 이 작업을 즉시 요청한 경우에 사용된다.
    • 사용자에 의해 어떤 일이 일어나도록 요청되어진 작업들을 말한다.
    • 이런 동작은 빨리 완료되어야하기에 이 큐는 매우 높은 우선순위를 가진다.
  • DispatchQoS.background
    • 사용자가 즉시 요청한 것은 아니지만 되도록 빨리 완료되면 좋은 작업들을 말한다.
  • DispatchQoS.utility
    • 앱 아키텍처의 일부분으로써 실행되는 작업들로 낮은 우선 순위를 가진다.
    • 예를 들면 데이터베이스에서 삭제하는 작업과 같은 단순한 유틸리티 작업들을 말한다.

 

queue.async { ... }

queue.sync { ... }

 

Async는 큐에 블록을 넣고 바로 반환한다.
그리고 원래 실행하던 코드의 다음 줄을 계속 실행한다. (비동기 작업)

Sync는 큐에 블록을 넣고 실행을 멈춘다.
누군가 큐에서 블록을 꺼내 실행을 완료할 때까지 기다리게 된다. (동기 작업)
메인 큐에서는 절대 sync 함수를 사용하지 않는다. 

반응형

'개발 > Swift' 카테고리의 다른 글

[Swift] 객체 저장 - UserDefaults  (0) 2021.02.28
[Swift] Multithreading  (0) 2021.02.26
[Swift] ViewController LifeCycle  (0) 2021.02.26
[Swift] Interface  (0) 2021.02.26
[Swift] NSAttributedString  (0) 2021.02.25