GCD in Swift
Swift에서도 GCD를 여전히 쓸 수 있다. 먼저 dispatch_async
함수는 Objective-C 에서는 아래와 같이 쓴다.
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
똑같은 방식으로 swift에서도 아래와 같이 정의된다.
func dispatch_async(queue:dispatch_queue_t!, block: dispatch_block_t!)
물론 swift에서 코드 블럭은 클로져이고, trailing closure 문법을 이용하면 보통은
dispatch_async(dispatch_get_main_queue()){
println("Currently dispatched asynchronously.")
}
이런 식으로 쓸 수 있다.
큐 관리
CGD의 큐는 세 종류가 있다.
- main : 메인스레드에서 순차적으로 실행되는 작업들
- concurrent: FIFO 순으로 꺼내지지만 동시에 돌기 때문에 끝나는 순서는 정해지지 않는다.
- seial : 한번에 하나씩 FIFO 순서에 의해 실행된다.
메인 큐는 시스템에 의해 자동으로 만들어지고 앱의 메인 스레드와 연계된다. 큐에 들어간 작업을 기다려야 한다면 dispatch_main
을 쓸 수 있다.
시스템은 그 외에 4개의 글로벌 큐를 갖는다. 이들은 백그라운드 작업이 되며, 어떤 스레드에서 돌 것인지는 시스템이 결정한다. 글로벌 큐는 앱에 대해서 전역이므로 아래 함수를 통해서 얻을 수 있다. 4개의 종류는 실행 퀄리티로 나눠지는 것이라고 보면 된다.
func dispatch_get_global_queue(_ identifier:Int,
_ flags:Int) -> dispatch_queue_t!
여기서 글로벌 큐의 식별자는 정수 상수값으로
QOS_USER_INTERACTION
QOS_CLASS_USER_INITIATED
QOS_CLASS_UTILITY
QOS_CLASS_BACKGROUND
순서로 높은 우선순위를 갖게 된다.
그외에 앱에서 사용하는 독립적인 큐를 생성할 수 있다.
func dispatch_queue_create(_ label: UnsafePointer<Int8>, _attr: dispatch_queue_attr_t!) -> dispatch_queue_t!
여기서 라벨은 문자열포인터형태로 전달되는 식별자이며, attr 은 DISPATCH_QUEUE_SERIAL
, DISPATCH_QUEUE_CONCURRENT
중 하나의 값이 된다.