dispatch group是GCD的一项特性,能够把任务分组。这组任务完成时,调用者会得到通知。
最重要的用途,把将要并发执行的多个任务合为一组。
把任务编组,有两种办法:
1、
dispatch_group_async(dispatch_group_t _Nonnull group, dispatch_queue_t _Nonnull queue, ^{
});
2、
dispatch_group_enter(dispatch_group_t _Nonnull group);
dispatch_group_leave(dispatch_group_t _Nonnull group);
用于等待dispatch group执行完毕的函数有两种:
1、
dispatch_group_wait(dispatch_group_t _Nonnull group, dispatch_time_t timeout);
2、
dispatch_group_notify(dispatch_group_t _Nonnull group, dispatch_queue_t _Nonnull queue, ^
{
});
实际使用:
1、
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
for (NSNumber *n in ary)
{
dispatch_group_async(dispatchGroup, queue, ^
{
int i = [n intValue];
NSLog(@"输出:%d", i);
});
}
dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER);
NSLog(@"结束了");
2、
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
for (NSNumber *n in ary)
{
dispatch_group_async(dispatchGroup, queue, ^
{
int i = [n intValue];
NSLog(@"输出:%d", i);
});
}
dispatch_queue_t notifyQueue = dispatch_get_main_queue();
dispatch_group_notify(dispatchGroup, notifyQueue, ^
{
NSLog(@"结束了");
});
在不同的优先级线程中执行任务:
NSMutableArray *ary = [NSMutableArray array];
for (int i = 0; i < 100; i ++)
{
NSNumber *n = [NSNumber numberWithInt:i];
[ary addObject:n];
}
NSMutableArray *ary2 = [NSMutableArray array];
for (int i = 200; i < 300; i ++)
{
NSNumber *n = [NSNumber numberWithInt:i];
[ary2 addObject:n];
}
dispatch_queue_t lowPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
for (NSNumber *n in ary)
{
dispatch_group_async(dispatchGroup, lowPriorityQueue, ^
{
int i = [n intValue];
NSLog(@"低输出:%d", i);
});
}
for (NSNumber *n in ary2)
{
dispatch_group_async(dispatchGroup, highPriorityQueue, ^
{
int i = [n intValue];
NSLog(@"高输出:%d", i);
});
}
dispatch_queue_t notifyQueue = dispatch_get_main_queue();
dispatch_group_notify(dispatchGroup, notifyQueue, ^
{
NSLog(@"结束了");
});
串行队列没有必要使用group,因为都是按照顺序执行的:
dispatch_queue_t queue = dispatch_queue_create("EOC1", NULL);
for (NSNumber *n in ary)
{
dispatch_async(queue, ^
{
int i = [n intValue];
NSLog(@"输出:%d", i);
});
}
dispatch_async(queue, ^
{
NSLog(@"结束");
});
由于GCD有并发队列机制,所以能够根据可用的系统资源状况来并发执行任务。
用GCD替代for循环:
dispatch_queue_t queue = dispatch_queue_create("EOC1", NULL);
dispatch_apply(ary.count, queue, ^(size_t i)
{
int n = [ary[i] intValue];
NSLog(@"输出:%d", n);
});
这样会等待执行完毕之后才能去执行之后的操作。