在日常开发中我们使用调度组的情况可能会比较少,而我们如果使用了调度组一般是使用这种形式的,因为这种形式的调度组我们容易理解也比较容易上手。如下所示
void
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_retain(group);
dispatch_group_enter(group);
dispatch_async(queue, ^{
block();
dispatch_group_leave(group);
dispatch_release(group);
});
}
这种的话概念就会比较清晰了,入组就是
dispatch_group_enter(group);
出组就是
dispatch_group_leave(group);
工作原理其实就是我们添加了一个任务由队列去调度,然后如果我们用入组其实就是做一个标记,调度组中就会对我们加进来的那个任务做个标记,也就是block中的内容。如果block中执行完成,这边加了个leave,其实就是将这个标记删除。dispatch_notify怎么进行判断所有任务都已经完成,其实就是通过判断group里面还没有内容来判断的
实例演练
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"AAAAA");
dispatch_group_leave(group);
});
void (^myBlock)()=^
{
[NSThread sleepForTimeInterval:1];
NSLog(@"BBBBBKKKKK");
};
NSLog(@"1");
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"BBBBB");
myBlock();
dispatch_group_leave(group);
});
NSLog(@"2");
dispatch_group_notify(group, q, ^{
NSLog(@"over");
});
NSLog(@"3");