소피it블로그

[Dispatch] DispatchQueue, main, async 정리 본문

개발_iOS/iOS 기타

[Dispatch] DispatchQueue, main, async 정리

sophie_l 2022. 8. 24. 23:47

https://developer.apple.com/documentation/dispatch/dispatchqueue

 

Apple Developer Documentation

 

developer.apple.com

DispatchQueue

앱의 메인 스레드나 백그라운드 스레드에서 순차적 혹은 동시적으로 실행되는 태스크들을 관리하는 객체

 

1. 선언

class DispatchQueue : DispatchObject

2. 개요

 

디스패치 큐는 앱이 블록 객체의 형태로 태스크를 제출할 수 있는 FIFO(선입선출) 큐이다. 디스패치 큐는 태스크를 순차적으로 혹은 동시적으로 실행한다. 디스패치 큐에 제출된 작업은 시스템이 관리하는 스레드의 풀에서 실행된다. 앱의 메인 스레드를 대변하는 디스패치 큐를 제외하면, 시스템은 태스크를 수행하기 위해 어떤 스레드를 사용할지를 특정해두지 않는다.

일 아이템은 동기적 혹은 비동기적으로 스케쥴된다. 동기적으로 스케쥴링할 경우, 코드는 해당 아이템이 실행을 끝내기까지 대기한다. 비동기적으로 스케쥴링할 경우, 해당 아이템이 다른 곳에서 돌아가고 있는 동안에도 코드는 계속해서 실행된다.

 

3. 지나친 스레드 생성은 피하라

 

동시적으로 실행되는 태스크들을 디자인할 때, 현재 실행 중인 스레드를 블록하는 메서드를 호출하지 마라. 동시적인 디스패치 큐로 스케쥴된 태스크가 스레드를 블록하게 되면, 시스템은 큐 되어있는 다른 동시 태스크들을 실행하기 위해 추가적인 스레드를 생성한다. 태스크들이 블록을 많이 하게 되면 시스템은 앱에 스레드를 더 이상 제공해줄 수 없게 된다.

앱이 스레드를 지나치게 소비하는 다른 방식은 프라이빗한 동시적 디스패치 큐를 너무 많이 만들었을 경우이다. 각 디스패치 큐가 스레드 자원을 소비하기 때문에, 동시적 디스패치 큐를 추가로 생성하는 것은 스레드 소비 문제를 악화시킨다. 프라이빗 동시적 큐를 생성하기보다는 글로벌한 동시적 디스패치 큐에 태스크를 제출하라. 연속적인 태스크의 경우, 글로벌 동시적 큐 중 하나를 연속적 큐의 타겟으로 삼아라. 그렇게 함으로써 스레드를 생성하는 큐들의 개수를 줄임과 동시에 큐의 연속적인 태도를 유지할 수 있다.

 


https://developer.apple.com/documentation/dispatch/dispatchqueue/1781006-main

 

Apple Developer Documentation

 

developer.apple.com

main

 현재 프로세스의 메인 스레드와 연관되어 있는 디스패치 큐

 

1. 선언

class var main: DispatchQueue { get }

2. 논의

 

시스템은 자동적으로 메인 큐를 생성하고 이를 애플리케이션의 메인 스레드와 연결짓는다. 앱은 메인 큐에 제출되는 블록을 실행하기 위해 다음 세 가지 접근법 중 하나만을 사용한다.

 

  • dispatchMain() 호출하기
  • 앱을 시작할 때 UIApplicationMain(_:_:_:_:) (iOS)이나 NSApplicationMain(_:_:) (macOS) 호출하기
  • 메인 스레드에서 CFRunLoop 사용하기

글로벌한 동시적 큐의 경우, suspend(), resume(), dispatch_set_context(_:_:) 등을 호출한다고 해도 이 프라퍼티에서의 큐에서 사용될 때는 효과가 없다.

앱이 네트워크 콜 만들기와 같이 소요시간이 긴 태스크를 진행하고자 한다면, 글로벌 시스템 큐나 다른 백그라운드 디스패치 큐에서 이를 실행하라. 혹은 콜의 비동기적인 버전을 사용할 수 있다면 사용하라.

 


https://developer.apple.com/documentation/dispatch/dispatchqueue/2016103-async

 

Apple Developer Documentation

 

developer.apple.com

async(execute:)

 일 아이템이 즉시 실행될 수 있도록 스케쥴링하며, 즉시 반환한다.

 

1. 선언

func async(execute workItem: DispatchWorkItem)

 2. 매개변수

 

workItem: 실행할 태스크를 포함하는 일 아이템