Swift

02. GCD (Grand Central Dispatch)

Stater 2019. 6. 19. 10:11

GCD(Grand Central Dispatch)

- 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍 기술을 애플에서 개발한 기능

- 멀티프로세싱에 관한 작업을 프로그래머가 아닌 운영체제에서 관리를 할 수 있도록 지원

- GCD에서 Queue , Sync & Async를 관리한다.

- 일련의 Task의 과정들을 안정적으로 진행되고, 작업될 수 있도록 도와주는 시스템

 

 

Async - 동시 다발적으로 일을 처리하는 비동기적 방식

Sync - 모두 기다렸다가 일을 처리하는 동기적 방식

 

[개발자가 설정하고 해야할 목록]

1. Queue

2. Sync & Async

위의 두 가지를 사용해서 설정해주면 된다.

 

DispatchQueue의 세가지

-The Main Queue

[참조] https://developer.apple.com/documentation/dispatch/dispatchqueue/1781006-main

 

 

main - DispatchQueue | Apple Developer Documentation

A dispatch queue that executes tasks concurrently and in any order, respecting any barriers that may be in place.

developer.apple.com

-현재 프로세스의 메인스레드의 Dispatch Queue와 관련되어있다.

-이 시스템에서 자동적으로 메인 큐가 생성되고, 당신의 애플리케이션의 메인스레드에 포함된다.

-메인큐에서 접근할 수 있는 세가지 항목은 다음과 같다.

 

Example Code

DispatchQueue.main.async {   UIApplicationMain(updateUI가 주를 이룬다.}

DispatchQueue.main.sync{ UIApplicationMain(updateUI가 주를 이룬다. }

대개는 작업시간이 짧은 일련의 작업들이 주를 이룬다.


-The Global Queue

[참조]https://developer.apple.com/documentation/dispatch/os_dispatch_queue_global

 

OS_dispatch_queue_global - Dispatch | Apple Developer Documentation

Class OS_dispatch_queue_global A system-provided dispatch queue that schedules tasks for concurrent execution. DeclarationOverviewYou do not create objects of this type directly. You receive a queue of the appropriate type when you create a new DispatchQue

developer.apple.com

- 동시 실행을 위한 태스크를 예약하는 시스템에서 제공하는 전송 대기열입니다.

- 사용자가 이 타입의 객체를 직접적으로 생성할 수 없다. 사용자는 DispatchQueue 객체를 새로 생성했을때 type에 관련된 큐를 받아서 사용한다.

 

QoS(Quality of Service)의 5가지 타입으로 나뉘어서 작업의 우선순위를 결정한다.

 

 1) userInteractive

   - 메인스레드에서 사용자 UI적인 작업

 2) userInitiated

   - 몇초 안걸리는 작업들

 3) default

   - 기본적인 설정들

 4) utilty

   - 수초에서 수분정도 걸리는 일련의 작업들

   - 무거운 작업에 사용

 5) background

   - 작업이 오래걸리거나 수분, 수시간 걸리는 작업등에 적합

Example Code
DispatchQueue.global(qos: .background).async{} 형태로사용

The Custom Que

 - 직업 큐를 생성해서 관리할 때 사용. 

 - 직접 생성해서 사용이 가능하다. 

Example Code

let concurrentQueue = DispatchQueue(label: “concurrent”, qos:.background, attribute: .concurrent)


[별개 참조소스]

- 서로 의존성이 있는 두 개의 큐를 같이 사용하는 방법

  [설명] 이미지를 다운로드 받고 받은 이미지를 UI화면에 출력할 때가 적절한 예시

 

DispatchQueue.global(qos: .background).async{

 let image = downloadImageFromServer()

 DispatchQueue.main.async {

 self.imageView.image = image

  }

}

 

반응형

'Swift' 카테고리의 다른 글

01. Swift Process+Thread(개념)  (0) 2019.06.19