Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save linearhw/2454e87e2a372965ce2c5ffe998f41ce to your computer and use it in GitHub Desktop.
Save linearhw/2454e87e2a372965ce2c5ffe998f41ce to your computer and use it in GitHub Desktop.
Effective Objective-C 44

디스패치 그룹의 특징

  • 다수의 작업을 병렬로 실행하고 모든 작업이 끝났을 때 후처리를 하고 싶은 때에 유용

디스패치 그룹을 사용하는 방법

dispatch_group_t dispatch_group_create();

// 같은 group 의 작업이라도 queue 가 같을 필요는 없다.
void dispatch_group_async(dispatch_group_t group,
                          dispatch_queue_t queue,  
                          dispatch_block_t block);

void dispatch_group_enter(dispatch_group_t group); // group 의 작업 수 1 증가
void dispatch_group_leave(dispatch_group_t group); // group 의 작업 수 1 감소

// 현재 스레드를 block 하고 기다린다
// timeout 전에 끝나면 0을, 그렇지 않으면 0이 아닌 값을 리턴
// timeout 을 DISPATCH_TIME_FOREVER 로 하면 영원히 기다린다.
long dispatch_group_wait(dispatch_group_t group,  
                         dispatch-time_t timeout); 
                                             
// 현재 스레드를 block 하지 않는다.      
// group이 끝나면 queue에서 block을 실행한다.
void dispatch_group_notify(dispatch_group_t group,
                           dispatch_queue_t queue,  
                           dispatch_block_t block); 

하지만 여러 개의 작업이 있다고 해서 매번 디스패치 그룹을 쓸 필요는 없다.

  • 모든 작업이 하나의 serial queue 에서 이루어진다면 굳이 group을 쓸 필요가 없다.
  • 그리고 이런 함수도 있다. 주어진 수만큼 block을 반복 수행한다.
void dispatch_apply(size_t iterations,
                    dispatch_queue_t queue,
                    void(^block)(size_t));
  • 하지만 이 함수는 모든 반복이 끝나기 전까지 current thread 를 block 한다.
  • 따라서 current thread 에서 block 을 수행하려고 하면 데드락이 발생한다.
  • background 로 수행하려면 디스패치 그룹을 사용해야...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment