1.思路:利用GCD信号量:dispatch_semaphore_signal
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
for (int i = 0 ; i<100; i++) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(queue, ^{
NSLog(@"任务%d开始",i);
sleep(i);
NSLog(@"任务%d结束",i);
dispatch_semaphore_signal(semaphore);
});
}
log:
创建5个任务.png 结束一个任务才开始新的任务.png2.模拟下载任务
下载20集连续剧
//20集电视剧资源,项目中替换为下载链接 www.xxxxxx.com/movie/xxxx_1;www.xxxxxx.com/movie/xxxx_2
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_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
for (int i = 0 ; i<moviesArray.count; i++) {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(queue, ^{
//www.xxxxxx.com/movie/xxxx_i
//模拟下载任务
NSLog(@"%@开始下载",moviesArray[i]);
sleep(10+i*2);//假设下载一集需要10+i*2秒
NSLog(@"%@下载完成",moviesArray[i]);
dispatch_semaphore_signal(semaphore);
});
}
log:
电视剧下载.gif
3.GCD信号量概念
GCD信号量概念.png
上图节选自https://www.jianshu.com/p/324c2fded696 信号量一节
网友评论