假设有一个页面有多个下载文件的需求,这个时候如果要执行多个下载文件的任务,这些耗时的任务会被放到多个线程上异步执行,直到全部的文件下载完成,弹出一个提示框来通知用户文件已下载完成。这个时候就需要用到我们的队列组的功能.
下面开始描述队列组的基本的使用.
1.创建一个队列组
dispatch_group_t fGroup = dispatch_group_create();
2.创建队列并添加任务.
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
}
});
3.添加通知的处理(所有的任务都执行完成后的回调.)
dispatch_group_notify(fGroup, queue, ^{
NSLog(@"都执行完啦");
});
上述代码整合如下
NSLog(@"开始了");
dispatch_group_t fGroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
}
for (int i = 0; i<5; i++) {
NSLog(@"2222-%d --- %@", i, [NSThread currentThread]);
}
});
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"3333-%d --- %@", i, [NSThread currentThread]);
}
for (int i = 0; i<5; i++) {
NSLog(@"4444-%d --- %@", i, [NSThread currentThread]);
}
});
dispatch_group_notify(fGroup, queue, ^{
// 所有的任务都执行完成后的回调.
NSLog(@"都执行完啦");
});
NSLog(@"结束了");
注意: 以上代码中 任务,有局限性,并不能解决实际开发中的网络请求任务.因为我们发起了网络请求,上面的任务block就会认为任务执行完成了,然而实际开发中,只要网络请求回调成功了才能确认为 任务执行完成.所有以上代码需要修改.
队列组修改完善版.
NSLog(@"开始了");
dispatch_group_t fGroup = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_enter(fGroup);
dispatch_group_async(fGroup, queue, ^{
// 发起网络请求
// 成功或者失败都掉用这个方法.
dispatch_group_leave(fGroup);
});
dispatch_group_enter(fGroup);
dispatch_group_async(fGroup, queue, ^{
// 发起网络请求
// 成功或者失败都掉用这个方法.
dispatch_group_leave(fGroup);
});
dispatch_group_notify(fGroup, queue, ^{
// 所有的任务都执行完成后的回调.
NSLog(@"都执行完啦");
});
NSLog(@"结束了");
注: dispatch_group_enter与dispatch_group_leave是成对出现的, 只要所有的enter 都调用了 leave, 才会调用notify