1.思路:GCD调度组:dispatch_group
- (void)dispatch_group{
NSArray*moviesArray = [NSArray arrayWithObjects:
@"第1集", @"第2集",@"第3集",@"第4集",@"第5集",
@"第6集",@"第7集",@"第8集",@"第9集",@"第10集",
@"第11集", @"第12集",@"第13集",@"第14集",@"第15集",
@"第16集",@"第17集",@"第18集",@"第19集",@"第20集",
nil];
dispatch_group_t group = dispatch_group_create();
//for循环创建任务,加入到group中
for (int i = 0; i<moviesArray.count; i++) {
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@开始下载",moviesArray[i]);
sleep(i+1);//假设后集比前集多耗时1秒,即第一集用时1秒,第二集2秒...
NSLog(@"%@下载完成",moviesArray[i]);
});
}
//group完成
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部任务下载完成");
});
}
或者
- (void)dispatch_group2{
NSArray*moviesArray = [NSArray arrayWithObjects:
@"第1集", @"第2集",@"第3集",@"第4集",@"第5集",
@"第6集",@"第7集",@"第8集",@"第9集",@"第10集",
@"第11集", @"第12集",@"第13集",@"第14集",@"第15集",
@"第16集",@"第17集",@"第18集",@"第19集",@"第20集",
nil];
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i<moviesArray.count; i++) {
dispatch_group_enter(group);//进入
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@开始下载",moviesArray[i]);
sleep(i+1);//假设后集比前集多耗时1秒,即第一集用时1秒,第二集2秒...
NSLog(@"%@下载完成",moviesArray[i]);
dispatch_group_leave(group);//抽出
});
}
//group完成
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部任务下载完成");
});
}
效果一样
2.概念
上图节选自 https://www.jianshu.com/p/324c2fded696 group一节