本文共 1892 字,大约阅读时间需要 6 分钟。
手动实现调度组
- (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]); });}
转载地址:http://kfkii.baihongyu.com/