前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-GCD信号量实现最大并发

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

作者头像
清墨
发布2019-10-28 17:36:19
2K0
发布2019-10-28 17:36:19
举报
文章被收录于专栏:清墨_iOS分享清墨_iOS分享

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()%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);这个方法在任务前还是后执行有关,如下:

代码语言:javascript
复制
-(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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档