GCD: Grand Central Dispatch 는 멀티코어와 멀티 프로세싱 환경에서 최적화된 프로그래밍을 위해 애플이 개발한 기술, 기본적으로 스레드 풀의 관리를 프로그래머가 아닌 운영체제에서 관리.

동작방식: 프로그래머가 실행할 태스크(작업) 생성하고, Dispatch Queue에 추가하면, GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 해당 스레드를 제거.

Dispatch Queue 종류 2가지:

Dispatch Source: 특정 유형의 시스템 이벤트를 비동기 처리하기 위한 C 기반 메커니즘. 특정 유형의 시스템 이벤트의 정보를 캡슐화하고, 해당 이벤트 발생 시 특정 클로저(블록) 객체 혹은 기능을 Dispatch Queue 에 전달

언제 사용?

예제

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]