GCD in Swift

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 중 하나의 값이 된다.