美文网首页
iOS控制并发数

iOS控制并发数

作者: 迷了jiang | 来源:发表于2019-11-22 10:01 被阅读0次

    并发是我们在多线程操作和资源限制时经常碰到的业务场景,解决方案也有很多,这里记录两种。
    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中添加到并发限制。

    相关文章

      网友评论

          本文标题:iOS控制并发数

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