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