iOS控制并发数

2019-11-22  本文已影响0人  迷了jiang

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

上一篇下一篇

猜你喜欢

热点阅读