iOS/Swift 문법

[Swift] GCD / Queue / Sync 와Async 차이

Chafle 2022. 3. 23. 19:02
반응형

IOS개발하면서, 동시성을 제공해 주기위해 사용할 수 있는 API에 GCD가 있습니다.

 

API란?

Application Programming Interface의 약자로

언어로 응용프로그램을 만들 때, 1000여개 이상의 함수로 구성된 운영체제와 응용프로그램의 통신에 사용되는 인터페이스입니다.

 


GCD란?

Grand Central Patch의 약자로

 

애플은

GCD provides and manages FIFO queues to which your application can submit tasks in the form of block objects. Work submitted to dispatch queues are executed on a pool of threads fully managed by the system. No guaratee si made as to the trhead on which a task executes.

 

??????????


 

해야할 일을 만들어서 GCD로 넘기면, 시스템에서 알아서 Thread를 할당해서 안전하게 실행 시켜 준다~

=> 개발자들이 코드블록만 만들어놓으면 나머지는 애플에서 제공하는 GCD로 실행하겠다는 의미입니다.

 

GCD는 queue를 이용해서 관리를 하게 됩니다.

 

그럼 Queue란.?

Queue 컴퓨터 공학에서 다루는 자료구조입니다.

First in First Out이라는 의미인데

들어온 순서대로 task를 처리하여 제일 처음 들어온 task가 제일 처음으로 나가는 자료구조 형태를 의미합니다.

 

 


애플은 GCD에서 사용하는 Queue를 DistpatchQueue로 명명을 해놨습니다.

DispatchQueue의 Type 3가지
1. Main Queue
2. Global Queue
3. Custom Queue

1. Main Queue

Main Thread에서 작동하는 Queue입니다.

ex. UI 등.

 

2. Global Queue

시스템에 의해 관리되는 Concurrent Queue입니다.

큐에 들어가는 테스크 우선순위를 QoSClass를 통해서 표현할 수 있습니다.

글로벌큐에서 수행할 친구들의 우선순위를 표현할 수 있는데 그걸 QoSClass다

 

QoS를 더욱 자세하게..
QoS = Quality of Service의 약자로 5개로 우선순위를 표현할 수 있습니다.

1. userInteractive

2. userInitiated

3. default

4. utility

5. background

 

1에서부터 우선순위가 높습니다.

 

1. userInteractive

MainThread와 같이 바로 수행해야 될 작업은 userInteractive로 설정합니다

2. userInitiated

사용자가 결과를 기다리는 작업(이것도 중요도가 높은 작업들)

3. default

덜 중요한 작업

4. utility

수 분 걸리는 작업(무거운 작업) ex. 네트워킹, 파일불러오기

5. background

사용자에게 당장 인식될 필요 없는 작업들 ex. 위치 업데이트, 영상 다운 등

 

3. Custom Queue

Custom Queue는 우리가 직접 생성해서 사용할 수 있는 Queue입니다.

concurrentqueue, serialQueue로 사용 가능합니다.

 


두 개의 Queue같이 쓰기

 

반응형

 

예시로 먼저 알아보겠습니다.

 

작업간의 의존도가 있는 작업들의 예로 들어보면, ex. 이미지 다운 -> UI업데이트

 

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

     let image = downloadImageFromServer()

     DispatchQueue.main.async {

           self.imageView.image = image

         }

}

 

=> 글로벌큐에서백그라운드 테스크를 서버로부터 이미지를 다운로드

    => 큐니까 이미지를 다운받은 후에

    => 메인큐 실행

          =>메인큐가 이미지 업데이트

 



 

큐에서 어떻게 작업을 수행할까요?

GCD에서는 task를 동기(Sync)/ 비동기(Async)로 수행합니다.

 

Sync 앞에작업이 끝나고 바로 뒤에 작업을 수행
Async 앞에 작업이 끝나지 않아도 다음 일을 수행

 

Async

 

예제를 통해 알아보겠습니다.

 

결과분석
공통점

global queue 공통사용

async 사용

 

차이점

background vs userInteractive

Async를 사용했기 때문에, 앞에 작업이 끝나지 않아도 작업을 시작합니다.

하지만 userInteractive의 우선순위가 더 높기 때문에 먼저 출력을 끝내버린 결과를 얻을 수 있습니다.

 


 

Sync

역시 예제를 통해 알아보겠습니다.

 

결과분석

 

공통점

global queue 공통사용

sync 사용

 

차이점

background vs userInteractive

sync를 사용했기 때문에, 앞에 작업이 끝나지 않는이상 결과출력을 하지 않습니다.

userInteractive의 우선순위가 더 높아도 앞에 작업이 끝나지 않았기 떄문에

background 먼저 마치고 userInteractive가 수행된 것을 알 수 있습니다.

 

 


 

알 수 있는 것

 

무거운 작업(다운로드 등)을 Sync로 돌리면 뒤에 있는 코드가 수행이 안되므로,

이런경우는 Async로 돌려주는 것이 낫습니다.

반응형