dispatch_group_t group = dispatch_group_create();
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block)
//  群组-统一监控一组任务
    dispatch_group_t group = dispatch_group_create();
   
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    // 添加任务
    // group 负责监控任务,queue 负责调度任务
    dispatch_group_async(group, q, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务1 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"任务2 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"任务3 %@", [NSThread currentThread]);
    });
  
    // 监听所有任务完成 - 等到 group 中的所有任务执行完毕后,"由队列调度 block 中的任务异步执行!"
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 修改为主队列,后台批量下载,结束后,主线程统一更新UI
        NSLog(@"OK %@", [NSThread currentThread]);
    });
   
    NSLog(@"come here");     // 群组-统一监控一组任务
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    
    // 1> 入组 -> 之后的 block 会被 group 监听
    // dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
    dispatch_group_enter(group);
    dispatch_async(q, ^{
        NSLog(@"task1 %@", [NSThread currentThread]);
        
        // block 的末尾,所有任务执行完毕后,添加一个出组
        dispatch_group_leave(group);
    });
    //  再次入组
    dispatch_group_enter(group);
    dispatch_async(q, ^{
        [NSThread sleepForTimeInterval:1.0];
        
        NSLog(@"task2 %@", [NSThread currentThread]);
        
        // block 的末尾,所有任务执行完毕后,添加一个出组
        dispatch_group_leave(group);
    });
   
    // 群组结束
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"OVER");
    });  
    NSLog(@"come here");dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
原文:http://blog.csdn.net/u011058732/article/details/44540063