常规用法

  1. - (void)group1 {
  2. // 1. 调度组
  3. dispatch_group_t group = dispatch_group_create();
  4. // 2. 队列
  5. dispatch_queue_t q = dispatch_get_global_queue(0, 0);
  6. // 3. 将任务添加到队列和调度组
  7. dispatch_group_async(group, q, ^{
  8. [NSThread sleepForTimeInterval:1.0];
  9. NSLog(@"任务 1 %@", [NSThread currentThread]);
  10. });
  11. dispatch_group_async(group, q, ^{
  12. NSLog(@"任务 2 %@", [NSThread currentThread]);
  13. });
  14. dispatch_group_async(group, q, ^{
  15. NSLog(@"任务 3 %@", [NSThread currentThread]);
  16. });
  17. // 4. 监听所有任务完成
  18. dispatch_group_notify(group, q, ^{
  19. NSLog(@"OVER %@", [NSThread currentThread]);
  20. });
  21. // 5. 判断异步
  22. NSLog(@"come here");
  23. }

enter & leavel

  1. // MARK: - 调度组 2
  2. - (void)group2 {
  3. // 1. 调度组
  4. dispatch_group_t group = dispatch_group_create();
  5. // 2. 队列
  6. dispatch_queue_t q = dispatch_get_global_queue(0, 0);
  7. // dispatch_group_enter & dispatch_group_leave 必须成对出现
  8. dispatch_group_enter(group);
  9. dispatch_group_async(group, q, ^{
  10. NSLog(@"任务 1 %@", [NSThread currentThread]);
  11. // dispatch_group_leave 必须是 block 的最后一句
  12. dispatch_group_leave(group);
  13. });
  14. dispatch_group_enter(group);
  15. dispatch_group_async(group, q, ^{
  16. NSLog(@"任务 2 %@", [NSThread currentThread]);
  17. // dispatch_group_leave 必须是 block 的最后一句
  18. dispatch_group_leave(group);
  19. });
  20. // 4. 阻塞式等待调度组中所有任务执行完毕
  21. dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  22. // 5. 判断异步
  23. NSLog(@"OVER %@", [NSThread currentThread]);
  24. }