iOS控制并发数

并发是我们在多线程操作和资源限制时经常碰到的业务场景,解决方案也有很多,这里记录两种。
1.使用NSOperationQueue来控制

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];//创建队列
    queue.maxConcurrentOperationCount = 3;//设置并发数
    for (NSInteger i = 0; i < 100; i ++) {
        // 使用 NSBlockOperation 创建操作
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
            [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
            NSLog(@"blockOperatio---i:%ld+%@",(long)i, [NSThread currentThread]); // 打印当前线程
        }];
        [queue addOperation:operation];//加入队列
    }

NSOperation是基于GCD的封装,更加的面向对象,使用起来更加便洁。
2.使用GCD的信号量来控制

    dispatch_semaphore_t sema = dispatch_semaphore_create(5);//创建信号量
    for (NSInteger i = 0; i < 100; i ++) {
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);//等待信号,直到信号量大于0时才可以操作,同时将信号量-1,小于0时阻塞不往下执行
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [NSThread sleepForTimeInterval:2];// 模拟耗时操作
            NSLog(@"i=%ld",i);
            dispatch_semaphore_signal(sema);//信号量通知,即让信号量+1
        });
    }

信号量这个词我们并不陌生,学校里操作系统中有生产者消费者模型,通过信号量进行资源竞争,完成程序调度。
3.也可以自己来判断,维护两个数组,一个存储所有任务A,一个存储待执行任务B,每次任务执行完的回调里检测B是否小于并发数,小于时从A中添加到并发限制。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,167评论 1 32
  • 前言 Pthread,NSThread,GCD和NSOperation是iOS中多线程的四种实现方案。 一.进程和...
    小李龍彪阅读 681评论 1 4
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,357评论 0 7
  • 为避免多线程同时争夺一块资源,将加锁、资源争夺的逻辑交给服务器端处理,减少移动端的压力 并发(concurrenc...
    一代骄马阅读 233评论 0 0
  • 快捷键是:Alt + Ctrl + O
    追梦小乐阅读 633评论 0 0