2015년 8월 25일 화요일

Swift - Dispatch Queue

디스패치 큐(Dispatch Queue)라는건 일종의 스레드 개념과 비슷하다. 클로져로 구성된 태스크(Task)를 이 큐(Queue)에다 등록하면 별도의 스레드에서 이 큐의 내용물을 뽑아서 해당 스레드에서 태스크를 구동시키게 해 주는 문 역활을 한다.

물론 큐가 1:1로 스레드와 연결되는 건 아니다. 큐에는 직렬큐(Serial Queue)와 병렬큐(Concurrent Queue)가 있다. 큐의 태스크는 단일 스레드에서 직렬로 돌아갈 수도 있고 병렬로 태스크 갯수 만큼의 스레드에서 모두 병렬로 돌아갈 수도 있다.

이미 GCD 기초글에서 메인큐(Main Queue)와 글로벌 큐(Global Queue)를 사용하는 방법에 대해서 다루었었는데, 이번에는 커스텀 큐를 만들어서 병렬 프로그래밍을 하는 방법 중 기초적인 것들을 알아보자. 다만 큐 생성 부분을 제외하면 기본적으로 동일하다보니 별로 볼 내용은 없을지도 모른다. -_-;

Update: Swift 3 기반의 문법으로 업데이트 하였다.

Basic APIs

DispatchQueue

DispatchQueue(구 dispatch_queue_t )는 디스패치 큐 클래스이다. 모든 큐는 이 타입을 가진다. Main Queue도, Global Queue도 모두 DispatchQueue 타입이다.

이 클래스의 인스턴스를 만든다는 건 새로운 작업 큐를 만든다는 것이다.
let queue = DispatchQueue(label: "some queue")
위와 같은 방식으로 원하는 대로 큐를 만들 수 있다. 물론 여기에도 옵션이 많다. 예를 들어 우선순위 라던가 시리얼인지 병렬인지 등 몇 가지 옵션이 있으니 필요하다면 매뉴얼을 찾아보자.

참고로 Swift 3 이전 혹은 Objective-C 에서는 큐를 생성 할 때 dispatch_queue_create() 함수를 이용해야 한다.

async()

DispatchQueue 의 async 메소드는 넘겨지는 클로져를 해당 큐에서 비동기로 실행시키는 메소드이다. 일반적으로 트레일링 클로져로 괄호가 생략되어서 메소드인지도 모를 수도 있겠지만...
queue.async {
  // some works
}
구 func dispatch_async() 함수와 동일한 역활이다.

sync()

이름만 보면 알 수 있을지도 모르겠다. 이번에는 태스크를 동기, 즉 코드 실행 순서에 맞게 태스크를 실행시킬 수 있게 해 주는 함수이다. 파라미터 구성은 동일하다.

이 녀석은 특이하게도 비동기 호출을 동기시킬 때 종종 쓰인다. 하지만 아마도 자주 쓸 일은 없을 것 같다.

예제

GCD기초글에서 봤던 것들과 큰 차이는 없을지도 모르겠지만 일단 글 구성 상 예제는 있어야 할 것 같다. -_-;;
let queueA = DispatchQueue("custom_queue-A")
let queueB = DispatchQueue("custom_queue-B")

queueA.async {
    for i in 0..<100 {
        println("#\(i) This is task on the Queue A")
    }
}

queueB.async {
    for i in 0..<100 {
        println("#\(i) This is task on the Queue B")
    }
}
​큐 두개를 만들고 각자 별도의 태스크를 실행시키는 코드이다. (참고로 플레이그라운드에서 이런 스레딩 예제들은 문제가 발생 할 수 있다. 참고하자.) 단순하다. 그냥 이런식으로 쓰인다. :-)

[돌아가기] Swift - 병렬 프로그래밍(Concurrency Programming) 가이드
[관련글] Swift - GCD(Grand Central Dispatch)기초​
[관련글] Swift - Dispatch Group

댓글 없음 :