DispatchQueue 란 ?

DispatchQueue는 작업 항목의 실행을 관리하는 클래스입니다.

DispatchQueue는 장점은 일반 Thread 보다 쉽고 효율적으로 코드를 작성할 수 있습니다. 보통 서버에서 데이터를 받고 이미지 동영상을 외부에서 다운로드 및 처리할 때 CPU 사용량이 많아 처리를 Main Thread가 아닌 별도의 Thread에서 처리한 뒤 Main Thread로 결과만을 전달하여 화면에 표시하도록 하여 CPU를 관리할 수 있습니다.

DispatchQueue의 종류 : Seral / Concurrent

Seral

Seral 는 DispatchQueue의 default 값이며 전형적인 queue
이전 작업이 끝나면 다음 작업을 순차적으로 실행하는 직렬 형태의 Queue. 하나의 자겁을 실행하고 그 실행이 끝날 때까지 대기열에 있는 다른 작업을 잠시 미루고 있다가 직전의 작업이 끝나면 실행합니다.

Concurrent

이전 작업이 끝날 때 까지 기다리지 않고 병렬 형태로 동시에 실행되는 Queue. 즉 대기열에 있는 작업을 동시에 별도의 Thread를 사용하여 실행합니다.

DispatchQueue 를 왜 사용해야되나?

비동기작업

비동기 작업: 메인 스레드에서 긴 작업을 수행하면 앱의 응답성이 떨어질 수 있습니다. DispatchQueue를 사용하여 백그라운드 스레드에서 작업을 수행하고, 결과를 메인 스레드로 전달하여 사용자 인터페이스를 끊김없이 유지할 수 있습니다.

동시성 제어

동시성 제어: 여러 스레드에서 동시에 실행되는 코드를 조정해야 하는 경우 DispatchQueue를 사용하여 크리티컬 섹션에 대한 동시성 제어를 수행할 수 있습니다.

타이머 및 지연 작업

타이머 및 지연 작업: 일정한 간격으로 작업을 수행하거나 특정 시간이 지난 후에 작업을 예약하려면 DispatchQueue를 사용할 수 있습니다.

DispatchQueue 를 어떻게 사용해야되나?

DispatchQueue는 별도 Thread에서 작업후 main thread에서 결과만 전달,
그러므로 비동기작업(동시)에서 자주쓰임

async예시

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)
}

async결과

타이머 및 지연 작업 예시

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 ?? "")
              }
          }
  }

DispatchQueue 사용 결과는?

이전화면에서 눌렀을시

함수호출되므로서 나타남

viewModel.foodData(type: recipeType ?? "")

자세한 결과는 https://github.com/APP-iOS3rd/Lab2_Food 에서 확인가능

profile
블로그 이전합니다 https://james-kim-tech.tistory.com/

0개의 댓글

Powered by GraphCDN, the GraphQL CDN