iOS - GCD(Grand Central Dispatch)

Main Thread

 - iOS에서 Main Thread는 오직 한 개만 존재

 - Interface Thread라고도 불리는데, UI와 관련된 작업은 Main Thread에 붙기 때문

 - UI와 관련된 작업은 반드시 Main Thread에서 작성해야 한다.

 - Main Thread는 Main Queue에서 실행되는데, Main Queue가 Serial Queue라서, 한번에 한 개의 Task밖에 실행하지 못함

 - UI를 실행하는 데에 영향을 줄만한(시간이 오래 걸리는) 코드들은 Main Thread에서 실행하면 안되고, Global Thread로 실행시켜 줘야 한다.

 

 

Global Thread (Background Thread)

 - iOS에서 Framework들은 모두 Background에서 구동이 된다.

 - 몸체는 Background에 있지만, 필요할 때 Main Thread에게 손(Delegate)을 뻗는 구조

ex) 음악을 재생하려면 음악 재생에 필요한 Framework를 사용, 음악 재생에 필요한 Framework 작업들을 모두 Background에서 실행되고, 음악 재생이 성공했다라는 것을 알려줄 때 Delegate, Completion Handler등을 통해 Main Thread에게 알려 통제할 수 있다.

 - 코드 실행이 오래 걸리는 작업은 직접 Background Thread로 실행시켜줘야 함

 

 

애플이 제공하는 Multi Threading을 위한 API

NSOperation / GCD

 

NSOperation

Objective-C언어 기반의 고수준 API

 - C로 구현된 GCD를 고수준 언어로 Wrapping 한 것

 - GCD보다 무겁고 약간에 오버헤드를 발생시킴

 - GCD엔 없는 기능 (작업 취소, KVO, 작업 재사용)

 

동작 방식

 - NSOperation을 NSOperationQueue에 추가하여 실행

(NSOperation Queue는 Concurrent Queue로 동작)

 

 

GCD

C언어 기반의 저수준 API

 - C언어 기반이기 때문에 가볍고 성능면에서 좋음

 - Block(Closure)로 구현되어 있어 코드 가독성면에서 좋고 간단하게 사용 가능

 - 작업 취소, KVO, 재사용 등등은 직접 만들어줘야 함

 - Dispatch Queue를 사용해서 Multi Threading을 지원함

 

 

Dispatch Queue

NSOperation에서 NSOperationQueue를 이용해 작업을 관리 했듯이,

GCD에선 Dispatch Queue라는 것을 이용해 작업을 관리

 

Dispatch Queue 2가지 Type (Serial Queue, Concurrent Queue)

 

1. Serial Queue

작업(Task)들을 순차적으로 처리하고, 한 번에 한 개의 Task 밖에 처리하지 못함

 

2. Concurrent Queue

동시에 여러 작업들을 처리

 

Dispatch Queue는 App이 실행함과 동시에 2가지 Queue가 자동생성

 

1. Main Queue (Serial Queue)

 - UI 관련 작업은 이곳에서 처리 되어야 함

DispatchQueue.main.async {
	// 원하는 작업
}

* Main Queue에는 절대 Sync Task를 추가할 수 없음

 

2. Global Queue (Concurrent Queue)

 - 정의에서 Qos는 Priority(우선 순위)인데, 우선순위를 직접 명시 가능

DispatchQueue.global().sync {
    //원하는 작업
}
DispatchQueue.global().async {
    //원하는 작업
}
DispatchQueue.global(qos: .userInteractive).sync {
    //원하는 작업
}

Qos를 지정하지 않으면 .Default로 지정됨

 

[출처 : https://babbab2.tistory.com/65]

'Language > Swift' 카테고리의 다른 글

iOS - Delegate 패턴  (0) 2022.11.05
iOS - Singleton Pattern  (0) 2022.11.01
iOS - Sync, Async, Serial, Concurrent  (1) 2022.10.31
iOS - 프로세스(Process) / 스레드(Thread)  (0) 2022.10.31
iOS - AppDelegate  (0) 2022.10.27