美文网首页
iOS-GCD信号量实现最大并发

iOS-GCD信号量实现最大并发

作者: _清墨 | 来源:发表于2019-10-26 14:06 被阅读0次

    1.实现最大并发数,在iOS里,最容易使用的是NSOperationQueue,如下

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 2;
    

    NSOperationQueue中,已经考虑到了最大并发数的问题,并提供了maxConcurrentOperationCount属性设置最大并发数(该属性需要在任务添加到队列中之前进行设置)。maxConcurrentOperationCount默认值是-1;如果值设为0,那么不会执行任何任务;如果值设为1,那么该队列是串行的;如果大于1,那么是并行的。

    2.用GCD信号量实现(默认你对信号量已有一定了解),如下:

    -(void)maxConcurrent{
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
        
        for (int i=0; i<10; i++) {
            float taskTime = arc4random()%10*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()%10*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

    相关文章

      网友评论

          本文标题:iOS-GCD信号量实现最大并发

          本文链接:https://www.haomeiwen.com/subject/vdwyvctx.html