GCD: Grand Central Dispatch 는 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 위해 애플이 개발한 기술, 기본적으로 스레드 풀의 관리를 프로그래머가 아닌 운영체제에서 관리.
동작방식: 프로그래머가 실행할 태스크(작업) 생성하고, Dispatch Queue에 추가하면, GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 해당 스레드를 제거.
Dispatch Queue 종류 2가지:
Dispatch Source: 특정 유형의 시스템 이벤트를 비동기 처리하기 위한 C 기반 메커니즘. 특정 유형의 시스템 이벤트의 정보를 캡슐화하고, 해당 이벤트 발생 시 특정 클로저(블록) 객체 혹은 기능을 Dispatch Queue 에 전달
언제 사용?
Operation Queue : 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하는 데 적합. KVO(Key Value Observing)를 사용해 작업 진행 상황을 감시하는 방법이 필요할 때도 적합.
(Operation Queue 는 작업의 실행 순서를 결정할 때에 다른 요인들을 고려)
GCD : 작업이 복잡하지 않고 간단히 처리하거나 특정 유형의 시스템 이벤트를 비동기 처리할 때 적합. 예를 들면 타이머, 프로세스 등 관련 이벤트.
(디스패치 대기열은 항상 FIFO - First in First out 순으로 작업 실행)
override func viewDidLoad() {
super.viewDidLoad()
//**"1":** 무조건 1등으로 출력. sync로 추가했기 때문에 "1" 출력되기 전까지 다음문장으로 넘어가지 않는다.
DispatchQueue.global().sync {
print("1")
}
//"2": 무조건 "1" 다음으로 출력.
print("2")
//**"3":** "2" 출력된 뒤, 2초 뒤에 출력. (sync가 아닌 async였다면 "3"은 무조건 꼴지로 출력)
DispatchQueue.global().sync {
sleep(2)
print("3")
}
//**"4":** "5"와 "6"의 관계는 알 수 없지만, 확실한건 "7"보다는 늦게 출력.
//"4"를 메인스레드에 추가하기 전 "7"을 출력하는 작업이 이미 추가되어 있고,
//메인스레드는 Serial 큐이기 때문.
DispatchQueue.main.async {
print("4")
}
//**"5", "6":** 서로 다른 Concurrent큐에 async로 추가되었다. 따라서 출력되는 순서는 장담할 수 없다.
DispatchQueue.global(qos: .background).async {
print("5")
}
DispatchQueue.global(qos: .userInteractive).async {
print("6")
}
//**"7":** 3보다는 늦게 출력되고 4보다는 먼저 출력된다. 무조건!!
print("7")
}
// 출처: [<https://rhammer.tistory.com/324>](<https://rhammer.tistory.com/324>) [고무망치의 Dev N Life]