JOIN行为
  CGD利用dispatch_group_wait来实现多个操作的join行为,代码如下:
1     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2     dispatch_group_t group = dispatch_group_create();
3
4     dispatch_group_async(group, queue, ^{
5         sleep(0.5);
6         NSLog(@"1");
7     });
8     dispatch_group_async(group, queue, ^{
9         sleep(1.5);
10         NSLog(@"2");
11     });
12     dispatch_group_async(group, queue, ^{
13         sleep(2.5);
14         NSLog(@"3");
15     });
16
17     NSLog(@"aaaaa");
18
19     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2ull * NSEC_PER_SEC);
20     if (dispatch_group_wait(group, time) == 0) {
21         NSLog(@"已经全部执行完毕");
22     }
23     else {
24         NSLog(@"没有执行完毕");
25     }
26
27     NSLog(@"bbbbb");

  这里起了3个异步线程放在一个组里,之后通过dispatch_time_t创建了一个超时时间(2秒),程序之后行,立即输出了aaaaa,这是主线程输出的,当遇到dispatch_group_wait时,主线程会被挂起,等待2秒,在等待的过程当中,子线程分别输出了1和2,2秒时间达到后,主线程发现组里的任务并没有全部结束,然后输出了bbbbb。
  在这里,如果超时时间设置得比较长(比如5秒),那么会在2.5秒时第三个任务结束后,立即输出bbbbb,也是说,当组中的任务全部执行完毕时,主线程不再被阻塞了。
  如果希望等待下去,时间可以设置为DISPATCH_TIME_FOREVER。
  并行循环
  类似于C#的PLINQ,OC也可以让循环并行执行,在GCD当中有一个dispatch_apply函数:
  1     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  2     dispatch_apply(20, queue, ^(size_t i) {
  3         NSLog(@"%lu", i);
  4     });
  这段代码让i并行循环了20次,如果内部处理的是一个数组,可以实现对数组的并行循环了,它的内部是dispatch_sync的同步操作,所以在执行这个循环的过程当中,当前线程会被阻塞。
  暂停和恢复
  使用dispatch_suspend(queue)可以暂停队列中任务的执行,使用dispatch_result(queue)可以继续执行被暂停的队列。