본문 바로가기
iOS/iOS

동시성 프로그래밍 (4) - GCD의 종류와 특성

by 패쓰킴 2024. 8. 12.
728x90

1) main

메인 이라는 이름 답게 단 한개가 존재하는 메인스레드를 이용한다

serial로 동작하며 보통은 별도 작업을 해주지 않으면 메인스레드에서 처리가 된다

print("task")

이렇게 단순한 출력 코드 조차도 

DispatchQueue.main.sync {
  print("task")
}

내부적으론 위와 같이 동작하고 있는 것!

 

2) global

concurrent로 동작하며 총 6가지의 옵션을 지정하여 우선순위를 결정할 수 있다. 

중요도가 높은 종류의 큐 사용시 iOS가 알아서 작업을 여러 스레드로 배치하고 배터리를 더 집중해서 사용하도록 한다.

 

만약 낮은 중요도의 큐 안에 더 높은 중요도의 큐 작업을 보내면 작업 수준은 자동으로 더 높은 중요도의 수준으로 변경된다.

let queue = DispatchQueue.global(qos: .background)

queue.async(qos: .utility) {

}

 

(중요도 높은 순)

^
|
|
|
|
|
|
|
|
DispatchQueue.global(qos: .userInteractive)
거의 즉시 처리되며 사용자와 직접적으로 상호작용 한다 (UI 업데이트, 애니메이션, UI 반응 등)
DispatchQueue.global(qos: .userInitiated)
처리 되는데 몇 초가 걸린다.
사용자가 즉시 필요로 하지만 시간이 조금 소요되어도 괜찮은 작업을 비동기적으로 처리하게 된다 (앱 내에서 pdf 파일을 여는 것과 같은 작업들)
DispatchQueue.global()
가장 일반적인 작업
DispatchQueue.global(qos: .utility)
몇 초에서 몇 분이 걸린다.
보통 progress indicator와 함께 실행되는 작업 (계산, IO, networking 등)
DispatchQueue.global(qos: .background)
몇 분 이상이 걸린다.
속도보다는 에너지 효율을 중요시 하는 작업에 사용되며, 사용자가 직접적으로 인지하지 않는, 시간이 중요하지 않은 작업에 사용된다. (데이터 미리 가져오기, 데이터베이스 유지 등)
DispatchQueue.global(qos: .unspecified)
레거시 api에서 사용된다.

 

3) private

디폴트 설정은 serial 이지만 concurrent로 설정이 가능하다.

우선순위(qos)도 설정이 가능하지만 따로 설정하지 않아도 알아서 추론한다.

let queue = DispatchQueue(label: "custom")

// concurrent로 변경
let queue = DispatchQueue(label: "custom:, attributes: .concurrent)

 

 

 

 

iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션

앨런(Allen) | 동시성(Concurrency)프로그래밍 - iOS프로그래밍에서 필요한 동기, 비동기의 개념 및 그를 확장한 GCD 및 Operation에 관한 모든 내용을 다룹니다., ✍️ 강의 제작 동기 '왜 동기vs비동기 개

www.inflearn.com

 

 

728x90

댓글