手动实现调度组
- (void)groupDemo
{
// 调度组
dispatch_group_t group = dispatch_group_create();
// 队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 下载图片A
// 1.进入调度组 : 给任务做标记
dispatch_group_enter(group);
// 2.让调度组里面的任务异步执行
dispatch_async(queue, ^{
NSLog(@"下载图片A %@",[NSThread currentThread]);
// 3.移出调度组 : 把标记从调度组移出
dispatch_group_leave(group);
});
// 下载图片B
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载图片B %@",[NSThread currentThread]);
dispatch_group_leave(group);
});
// 下载图片C
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载图片C %@",[NSThread currentThread]);
dispatch_group_leave(group);
});
// 监听一组异步任务是否执行结束
dispatch_group_notify(group, queue, ^{
NSLog(@"三张图片下载完了 %@",[NSThread currentThread]);
});
}
使用GCD调度组监听一组异步任务是否完成
// 使用调度组下载图片 : 演示调度组不是用来解决线程安全问题的
- (void)groupDemo
{
// 调度组
dispatch_group_t group = dispatch_group_create();
// 队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 循环的使用调度组去异步的下载图片
for (NSInteger i = 0; i < 1000; i++) {
// 调度组异步执行的函数 : 会把每个任务都在group里面做一个标记
dispatch_group_async(group, queue, ^{
// 获取本地图片的全路径
NSString *name = [NSString stringWithFormat:@"%02zd",(i%10)+1];
NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
// 获取图片
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
NSLog(@"%@ %@",name,[NSThread currentThread]);
// 图片下载完成之后,需要缓存到沙盒,如果监听到这组异步任务执行结束,就在`dispatch_group_notify`方法里面,刷新UI
});
}
// 一旦一组异步任务执行结束之后,可以得到统一的通知,这个函数默认在子线程执行的
// 这个方法不会循环多次的调用,只会执行一次
dispatch_group_notify(group, queue, ^{
// 一组异步任务执行结束之后的操作,写在这个代码块里面,一般是刷新UI的,需要回到主线程
NSLog(@"1000张图片执行完了? %@",[NSThread currentThread]);
});
}