前言
大家都知道对于NSOperationQueue队列来说,要实现最大并发数是比较轻而易举的事,只需要设置它的属性maxConcurrentOperationCount就可以办到。
//创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//设置最大并发量(最多同时执行10个任务)
queue.maxConcurrentOperationCount = 10;
对GCD而,只有靠自己想方法处理
GCD可以用信号量semaphore来实现,费话不多说,直接上代码
//建立任务组
dispatch_group_t group = dispatch_group_create();
//设置信号量大小
dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
//创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//添加实现任务
for (int i = 0; i < 100; i++) {
//semphore值为0时会一直等待执行。当>=1时执行下面的代码。可通过一次,会将semphore的值减1.
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//监视queue队列
dispatch_group_async(group, queue, ^{
NSLog(@"这里在执行耗时操作----%i",i);
sleep(2);
//当前线程执行完成后,使semaphore的值加1,这样,如果semphore的值就加1,会触发dispatch_semaphore_wait执行一条代码
dispatch_semaphore_signal(semaphore);
});
}
//永远地监听Group中的任务是否执行完成。
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
关于信号量的一些深刻的理解,可以察看 fhbystudy的分享,也谢谢他的分享!