1.实现最大并发数,在iOS里,最容易使用的是NSOperationQueue,如下
代码语言:javascript复制NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 2;
NSOperationQueue中,已经考虑到了最大并发数的问题,并提供了maxConcurrentOperationCount属性设置最大并发数(该属性需要在任务添加到队列中之前进行设置)。maxConcurrentOperationCount默认值是-1;如果值设为0,那么不会执行任何任务;如果值设为1,那么该队列是串行的;如果大于1,那么是并行的。
2.用GCD信号量实现(默认你对信号量已有一定了解),如下:
代码语言:javascript复制-(void)maxConcurrent{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
for (int i=0; i<10; i ) {
float taskTime = arc4random()*0.1*3;
NSLog(@"开始第%d条任务",i);
[self netWork_task_requestTime:taskTime completionHandle:^{
NSLog(@"已完成第%d条任务",i);
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
}
- (void)netWork_task_requestTime:(float)time completionHandle:(void(^)(void))success {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
success();
});
}
得到的结果是这样的
image.png
解释:
我们可以看到,第1-4一共4条任务得以执行,然后只有完成一条或多条任务后,另一条或多条才能得以执行,控制了任务执行的最大数量是4条。
我们信号量给的是3,从结果来看最大并发数是4,这只是跟
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
这个方法在任务前还是后执行有关,如下:
-(void)maxConcurrent{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
for (int i=0; i<10; i ) {
float taskTime = arc4random()*0.1*3;
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"开始第%d条任务",i 1);
[self netWork_task_requestTime:taskTime completionHandle:^{
NSLog(@"已完成第%d条任务",i 1);
dispatch_semaphore_signal(semaphore);
}];
}
}
image.png