DispatchQueue는 작업 항목의 실행을 관리하는 클래스입니다.
DispatchQueue는 장점은 일반 Thread 보다 쉽고 효율적으로 코드를 작성할 수 있습니다. 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 Main Thread가 아닌 별도의 Thread에서 처리한 뒤 Main Thread로 결과만을 전달하여 화면에 표시하도록 하여 CPU를 관리할 수 있습니다.
DispatchQueue의 종류 : Seral / Concurrent
Seral 는 DispatchQueue의 default 값이며 전형적인 queue
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 Queue. 하나의 자겁을 실행하고 그 실행이 끝날 때까지 대기열에 있는 다른 작업을 잠시 미루고 있다가 직전의 작업이 끝나면 실행합니다.
이전 작업이 끝날 때 까지 기다리지 않고 병렬 형태로 동시에 실행되는 Queue. 즉 대기열에 있는 작업을 동시에 별도의 Thread를 사용하여 실행합니다.
비동기 작업: 메인 스레드에서 긴 작업을 수행하면 앱의 응답성이 떨어질 수 있습니다. DispatchQueue를 사용하여 백그라운드 스레드에서 작업을 수행하고, 결과를 메인 스레드로 전달하여 사용자 인터페이스를 끊김없이 유지할 수 있습니다.
동시성 제어: 여러 스레드에서 동시에 실행되는 코드를 조정해야 하는 경우 DispatchQueue를 사용하여 크리티컬 섹션에 대한 동시성 제어를 수행할 수 있습니다.
타이머 및 지연 작업: 일정한 간격으로 작업을 수행하거나 특정 시간이 지난 후에 작업을 예약하려면 DispatchQueue를 사용할 수 있습니다.
DispatchQueue는 별도 Thread에서 작업후 main thread에서 결과만 전달,
그러므로 비동기작업(동시)에서 자주쓰임
playground예시
import UIKit
DispatchQueue.global(qos: .background).async {
for item in 1...10 {
print("Async (1) : \(item)")
}
}
DispatchQueue.global(qos: .background).async {
for item in 30...40 {
print("Async (2) : \(item)")
}
}
for item in 90...100 {
print(item)
}
swiftUI에서 작업 https://github.com/APP-iOS3rd/Lab2_Food 확인
이코드는 type에 레시피종류를 입력하면 데이터를 호출하는 코드
0.5초 후에 viewModel 객체의 foodData 메서드를 메인 스레드에서 비동기적으로 호출합니다. 이런 방식으로 지연된 작업을 메인 스레드에서 수행하면서 앱의 응답성을 유지할 수 있습니다.
if !viewModel.isFinish {
ProgressView()
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
viewModel.foodData(type: recipeType ?? "")
}
}
}
viewModel.foodData(type: recipeType ?? "")
자세한 결과는 https://github.com/APP-iOS3rd/Lab2_Food 에서 확인가능