[iOS 8주차] DispatchQueue

황석범·2024년 12월 23일
1

내일배움캠프_iOS_5기

목록 보기
50/76

https://developer.apple.com/documentation/DISPATCH

DispatchQueue


DispatchQueue는 GCD (Grand Central Dispatch)의 핵심 요소로, 작업을 비동기적으로 실행하거나, 특정 작업을 동기적으로 실행하는 데 사용되는 큐입니다. 멀티스레드 프로그래밍을 간소화하기 위해 설계되었으며, 애플의 모든 플랫폼에서 사용할 수 있습니다.

DispatchQueue

  • Dispatch: 보내다, 발송하다.
  • Queue: 큐. 자료구조 . 중큐를 의미.
  1. 작업 스케줄링:
    DispatchQueue는 큐에 추가된 작업을 스레드에 배치하여 효율적으로 실행합니다.
  2. FIFO 순서 보장:
    각 큐는 FIFO (First-In, First-Out) 규칙을 따릅니다.
    작업이 추가된 순서대로 실행됩니다.
  3. 스레드 관리:
    개발자가 직접 스레드를 생성하고 관리할 필요 없이, DispatchQueue가 스레드를 관리합니다.

DispatchQueue 실습


DispatchQueue.{큐종류}.{qos옵션}.{sync/async/after/barrier} {
	// 수행할 작업 코드 작성
}
// 큐 종류: Main / Global / Custom
// qos: Quality Of Service
// sync: 동기적으로 작업 수행
// async: 비동기적으로 작업 수행

DispatchQueue 종류


  1. 메인 큐 (Main Queue)
    • UI 업데이트와 관련된 작업을 처리
    • 앱의 메인 스레드에서 실행
    • Serial Queue. (직렬 큐)
  2. 글로벌 큐 (Global Queue)
    • 백그라운드 작업을 처리
    • Concurrent Queue. (동시성 큐)
  3. 커스텀 큐 (Custom Queue)
    • 개발자가 직접 생성하고 관리하는 큐
    • 직렬(Serial) 또는 동시(Concurrent) 큐로 설정 가능

Serial vs Concurrent


  • Serial Queue (직렬 큐)
    • 들어온 작업들은 한 가지 쓰레드에 모두 보내는 큐
    • 큐에 추가된 작업을 한 번에 하나씩 순서대로 실행하는 큐
    • 쓰레드 하나에 모든 작업을 할당하기 때문에 작업 완료 순서가 보장됨
  • Concurrent Queue (동시성 큐)
    • 큐에 추가된 여러 작업을 동시에 실행할 수 있는 큐
    • 여러 스레드에서 작업이 동시에 병렬적으로 실행 가능
    • 작업의 완료 순서는 보장되지 않음

DispatchQueue 사용법


  • MainQueue 사용
    DispatchQueue.main.async {
        // UI 업데이트 코드
        self.label.text = "작업 완료!"
    }
  • GlobalQueue 사용

    DispatchQueue.global().async {
        // 네트워크 통신 또는 계산이 무거운 작업을 백그라운드에서 수행
        let result = self.someHeavyComputation()
        
        DispatchQueue.main.async {
            // 결과를 메인 스레드에서 UI에 반영
            self.updateUI(with: result)
        }
    }
  • Custom Queue 사용

    // label 에 큐의 고유한 이름 설정.
        // attributes 에 serial/concurrent 설정.
        // 설정하지 않으면 default 값은 serial.
        let customQueue = DispatchQueue(
                label: "com.myapp.customqueue", 
                attributes: .concurrent
        )
    
        customQueue.async {
            // 커스텀 큐에서 실행할 작업
        }

Qos (Quality Of Service)


작업의 중요도를 시스템에 알려주는 방법.

이를 통해 시스템은 리소스(CPU 시간, 에너지 등)를 효율적으로 분배할 수 있다.

이 작업이 어느정도의 중요도인지를 OS 에게 알리고 작업을 할당하는데 도움을 준다고 이해 가능.

  1. User Interactive (최고 우선순위)
    • 설명: 지금 당장 해야하는 작업
    • 예시: UI 업데이트, 애니메이션 등
    • 특징: 매우 빠르게 처리되어야 하는 작업
  2. User Initiated (높은 우선순위)
    • 설명: 사용자가 기다리고 있다는 것을 알림
    • 예시: 버튼 클릭 후 데이터 로딩
    • 특징: 몇 초 안에 완료되어야 하는 작업
  3. Default (기본 우선순위)
    • 설명: 평범한 작업
    • 예시: 일반적인 백그라운드 작업
    • 특징: 특별한 지정이 없을 때 사용됨
  4. Utility (낮은 우선순위)
    • 설명: 천천히 해도 되는 작업
    • 예시: 데이터 다운로드, 백업
    • 특징: 시간이 걸리지만 즉시 필요하지 않은 작업
  5. Background (최저 우선순위)
    • 설명: 언제 끝나도 상관없는 작업
    • 예시: 대용량 데이터 정리, 동기화
    • 특징: 사용자가 직접적으로 인지하지 못하는 작업
  6. Unspecified (시스템 결정)
    • 설명: 어떤 우선순위로 처리해도 상관없는 작업
    • 특징: 시스템이 알아서 우선순위 결정

DispatchQueue의 주요 메서드

1.async

  • 비동기적으로 작업을 실행.
DispatchQueue.global().async {
    print("Run task asynchronously")
}

2. sync

  • 동기적으로 작업을 실행.
DispatchQueue.global().sync {
    print("Run task synchronously")
}

3. after

  • 지연 후 작업을 실행.
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    print("Task executed after 2 seconds")
}

4. barrier

  • 병렬 큐에서 작업 실행 중 동기점을 설정.
  • 모든 이전 작업이 완료된 후 실행됩니다.
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
concurrentQueue.async(flags: .barrier) {
    print("Barrier task")
}

주의사항

  1. Main Thread에서 블로킹 작업 금지:
  • 동기 작업(sync)을 메인 큐에서 호출하면 앱이 멈춥니다 (Deadlock).
  1. 메모리 관리:
  • 작업 중 self를 캡처하면 강한 참조 순환이 발생할 수 있으므로 [weak self]를 사용.
profile
iOS 공부중...

0개의 댓글

관련 채용 정보