前言
在开发app的时候,难免会遇到这样的需求:当你需要异步请求两个接口,必须两个两个接口完成才能刷新界面。在例如要请求三张图片的接口,然后把三张请求完的图片合成一张图。这个时候就需要用到dispatch_group队列组。
dispatch_group 队列组
//DISPATCH_QUEUE_CONCURRENT创建并发队列
// dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//这个方法也可以,创建并发队列
dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, globalQue, ^{
sleep(1);
NSLog(@"休眠1s 执行任务");
});
dispatch_group_async(group, globalQue, ^{
sleep(2);
NSLog(@"休眠2s 执行任务");
});
dispatch_group_async(group, globalQue, ^{
sleep(3);
NSLog(@"休眠3秒 执行任务");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//前三组是并行执行的,3s后这三个线程都执行完毕,会执行done
NSLog(@"done");
});
多次执行,打印结果:
休眠1s 执行任务
休眠2s 执行任务
休眠3秒 执行任务
done
只有当三个任务都执行完毕,才会执行dispatch_group_notify这个方法,做一些处理。
dispatch_group_wait 暂停当前线程
暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。
下面用代码来演示一下:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t globalQue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, globalQue, ^{
sleep(1);
NSLog(@"休眠1s 执行任务");
});
dispatch_group_async(group, globalQue, ^{
sleep(2);
NSLog(@"休眠2s 执行任务");
});
// 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end");
}
多次执行结果都会发现打印end都是最后执行。
休眠1s 执行任务
休眠2s 执行任务
end
当所有任务执行完成之后,才执行 dispatch_group_wait 之后的操作。但是,使用dispatch_group_wait 会阻塞当前线程。
dispatch_group_enter/dispatch_group_leave
这种方式用在不使用dispatch_group_async来提交任务,且必须配合使用.相当于dispatch_group_async.
休眠1s 执行任务
休眠2s 执行任务
done
个人任务和内存管理的引用计数类似,我们可以认为group也持有一个整形变量(只是假设),当调用enter时计数加1,调用leave时计数减1,当计数为0时会调用dispatch_group_notify并且dispatch_group_wait会停止等待;
网友评论