[iOS] GCD

r1verfuture·2022년 4월 18일
0

iOS

목록 보기
26/30

GCD

  • Grand Central Dispatch
  • C 기반
  • Background 에서 Thread 를 관리하면서 동시적으로 작업을 실행시키는 저수준 API 를 제공하는 라이브러리
  • 앱을 실행하면 시스템에서 기본적으로 2개의 Queue (Main Queue & Global Queue) 를 만들어 준다.

Dispatch Queue

  • FIFO (First In First Out) 구조로 작업을 실행시킨다.
  • Serial Dispatch QueueConcurrent Dispatch Queue 로 나눌 수 있다.
  • syncasync 메소드를 가지고 있다.
  • Apple 공식 문서

Serial Dispatch Queue

  • 직렬 처리
  • 등록된 작업을 한번에 하나씩 차례대로 처리한다.
  • 처리 중인 작업이 완료되면 다음 작업을 처리한다.
// MARK: [코드 1] Custom Serial Dispatch Queue 예시
// (qos 설정 가능하지만 설정 안해주면 iOS 가 작업을 판단해서 qos 추론한다.)
let serialQueue = DispatchQueue(label: "myQueue.serial")

Concurrent Dispatch Queue

  • 병렬 처리
  • 시작한 작업이 끝나는 것을 기다리지 않고 가능한 많은 작업을 실행한다.
  • 등록된 작업을 한번에 하나씩 처리하는 것이 아니라 여러 작업들을 동시에 처리한다.
// MARK: [코드 2] Custom Concurrent Dispatch Queue 예시
// (qos 설정 가능하지만 설정 안해주면 iOS 가 작업을 판단해서 qos 추론한다.)
let concurrentQueue = DispatchQueue(label: "myQueue.concurrent", attributes: .concurrent)

Main Queue

  • 메인 스레드 (UI 스레드) 에서 사용되는 Serial Queue
  • 모든 UI 처리는 메인 스레드에서 처리해야 한다.
// MARK: [코드 3] Main Queue 예시
let mainQueue = DispatchQueue.main

Global Queue

  • 편의상 사용할 수 있게 만들어둔 Concurrent Dispatch Queue
  • 처리 우선 순위를 위한 qos (Quality of Service) 파라미터를 제공한다.
  • 병렬적으로 동시에 일을 처리하기 때문에 작업 완료 순서는 정할 수 없지만 우선적으로 일을 처리하게 할 순 있다.
// MARK: [코드 4] Global Queue 예시
let globalQueue = DispatchQueue.global(qos: .background)

qos 파라미터 (우선 순위 설정)

DispatchQueue.global(qos: .userInteractive)

  • userInteractive
  • 가장 높은 순위
  • 즉시 완료해야 하는 작업
  • 애니메이션 / 이벤트 처리 / UI 업데이트

DispatchQueue.global(qos: .userInitiated)

  • userInitiated
  • 사용자가 앱을 적극적으로 사용하지 못하도록 한다.

DispatchQueue.global()

  • default
  • 일반적인 작업

DispatchQueue.global(qos: .utility)

  • utility
  • 사용자가 적극적으로 추적하지 않는 작업에 사용된다.

DispatchQueue.global(qos: .background)

  • background
  • 유지 보수 / 정리 태스크

DispatchQueue.global(qos: .unspecified)

  • unspecified
  • 가장 낮은 순위

sync 메소드

  • 동기 처리 메소드
  • 해당 작업을 처리하는 동안 다음으로 진행되지 않고 계속 머물러 있다가 해당 작업 처리가 완료되면 그 다음으로 넘어간다.
  • 시간이 꽤 걸리는 큰 작업이거나 언제 끝날지 알 수 없는 작업인 경우에는 작업이 처리되는 동안 아무 동작도 하지 않고 있기 때문에 앱이 렉에 걸리거나 아무 반응이 없는 것처럼 보이기 때문에 이 경우에는 sync 메소드를 웬만하면 쓰지 않는다.
// MARK: [코드 5] Dispatch Queue 의 sync 메소드 예시
DispatchQueue.main.sync {
	print("SYNC METHOD 실행중 ~~")
}

print("SYNC METHOD 실행 끝 !")
  • [코드 5] 를 실행하면 'SYNC METHOD 실행중 ~~' 이 무조건 먼저 출력되고 그 다음에 'SYNC METHOD 실행 끝 !' 이 출력된다.

async 메소드

  • 비동기 처리 메소드
  • 처리하라고 지시한 후 다음으로 넘어가 버린다.
  • 시간이 꽤 걸리는 큰 작업이거나 언제 끝날지 알 수 없는 작업 (ex. 네트워크, 파일 로딩 작업) 에 주로 사용된다.
// MARK: [코드 6] Dispatch Queue 의 async 메소드 예시
DispatchQueue.global(qos: .background).async {
	print("ASYNC METHOD 실행중 ~~")
}

print("ASYNC METHOD 실행 끝 !")
  • [코드 6] 을 실행하면 'ASYNC METHOD 실행 끝 !' 이 무조건 먼저 출력되고 그 다음에 'ASYNC METHOD 실행중 ~~' 이 출력된다.

참고

profile
#iOS #Swift #Developer #Python

0개의 댓글

관련 채용 정보