问题一、在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理?
1、使用一个Serial Dispatch Queue时,只要将结束处理最后追加即可。
2、使用Concurrent Dispatch Queue时,使用Dispatch Group。
// 例子:追加3个Block到Global Dispatch Queue,这些处理全部执行完毕,会执行追加到Main Dispatch Queue中的结束处理Block
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"0");
});
dispatch_group_async(group, queue, ^{
NSLog(@"1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"2");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"done");
});
dispatch_release(group);
说明:
dispatch_group_create函数生成dispatch_group_t类型的Dispatch Group,函数中含有create,所以在使用结束后需要通过dispatch_release函数释放。
dispatch_group_async函数,第一个参数为生成的Dispatch Group,第二个参数为Dispatch Queue,第三个参数是Block,将Block追加到Dispatch Queue中,Block属于指定的Dispatch Group。
Block通过dispatch_retain函数持有Dispatch Group,Block执行结束,通过dispatch_release函数释放持有的Dispatch Group。Dispatch Group使用结束,不用考虑Block,立即通过dispatch_release函数释放即可。
dispatch_group_notify函数第一个参数为要监视的Dispatch Group,第二个参数为要追加结束处理的Dispatch Queue,第三个结束处理Block。
问题二、dispatch_group_wait函数,等待全部处理执行结束?
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"0");
});
dispatch_group_async(group, queue, ^{
NSLog(@"1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"2");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
说明:
dispatch_group_wait函数第一个参数为等待的Dispatch Group,第二个参数为等待的时间(超时),为dispatch_time_t类型。
DISPATCH_TIME_FOREVER:永久等待。
问题三、dispatch_group_wait函数,指定等待时间间隔?
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 1ull * NSEC_PER_SEC);
long result = dispatch_group_wait(group, time);
if (result == 0) {
// 全部处理执行结束
} else {
// 某一个处理还在执行中
}
说明:
dispatch_group_wait函数返回值为0:全部处理执行结束
dispatch_group_wait函数返回值不为0:某一个处理还在执行中
等待时间为DISPATCH_TIME_FOREVER,返回值恒为0。
注意:一旦调用dispatch_group_wait函数,该函数就处于调用状态而不返回。执行该函数的当前线程停止,在经过该函数中指定的时间或该函数的所有处理全部执行结束之前,执行该函数的线程停止。
// 指定DISPATCH_TIME_NOW,则不用任何等待即可判断属于Dispatch Group的处理是否全部执行结束
long result = dispatch_group_wait(group, DISPATCH_TIME_NOW);
网友评论