美文网首页
iOS for 循环内执行异步任务,但又需要串行执行。

iOS for 循环内执行异步任务,但又需要串行执行。

作者: LV大树 | 来源:发表于2021-05-20 18:58 被阅读0次

for 异步任务需要将当前线程阻挡住,
这个时候考虑到信号量:dispatch_semaphore_t。
但另一个思路:lock行不行呢?如果用nslock呢。在for 外部定于一个lock。循环内开始的是 lock on,异步任务结束后 Lock off。这个思路还没验证。以下的代码是抄袭的。

printf("处理前创建信号量,开始循环异步请求操作\n");

// 1.创建一个串行队列,保证for循环依次执行
        dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

// 2.异步执行任务
dispatch_async(serialQueue, ^{
    // 3.创建一个数目为1的信号量,用于“卡”for循环,等上次循环结束在执行下一次的for循环
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    for (int i = 0; i<5; i++) {
        // 开始执行for循环,让信号量-1,这样下次操作须等信号量>=0才会继续,否则下次操作将永久停止

        printf("信号量等待中\n");
        // 模拟一个异步任务
        NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://github.com"]];
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 本次for循环的异步任务执行完毕,这时候要发一个信号,若不发,下次操作将永远不会触发
            [tampArray addObject:@(i)];
            NSLog(@"本次耗时操作完成,信号量+1 %@\n",[NSThread currentThread]);
            dispatch_semaphore_signal(sema);

        }];
        [dataTask resume];
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }

    NSLog(@"其他操作");
    for (NSNumber *num in tampArray) {
        NSLog(@"所有操作完成后的操作--->   %@\n",num);
    }

});

相关文章

  • iOS for 循环内执行异步任务,但又需要串行执行。

    for 异步任务需要将当前线程阻挡住,这个时候考虑到信号量:dispatch_semaphore_t。但另一个思路...

  • GCD小总结

    单例模式 串行队列同步/异步执行任务 并发队列同步/异步执行任务 队列组 延时执行 barrier

  • iOS 多线程-CGD

    串行队列同步执行,不开启新线程,任务按顺序执行 串行队列异步执行,会开启新线程(1个),任务按照顺序执行 并行队列...

  • iOS学习笔记_GCD的基本使用

    1、 异步函数+并发队列:开启多条线程,并发执行任务2、 异步函数+串行队列:开启一条线程,串行执行任务3、...

  • GCD各种情况整理

    01 异步函数+并发队列:开启多条线程,并发执行任务02 异步函数+串行队列:开启一条线程,串行执行任务03 同步...

  • iOS 实现并发和串行任务

    串行任务 场景:现有3个耗时任务A,B,C 需要依次有序执行。分析:为了不阻塞主线程,只能异步依次执行任务A,B,...

  • 关于串并行

    串行执行任务队列items 并行执行任务队列items 串行与并行的结合,即每次设定最多能并行n个异步任务

  • iOSIN-GCD

    队列和同步异步 区别并行队列串行队列主队列同步(sync)没有开启新线程,串行执行任务没有开启新线程,串行执行任务...

  • iOS GCD笔记

    串行队列 并发队列 主队列 全局并发队列 同步执行 异步执行 同步+并发队列 = 没有开启新线程,串行执行任务 s...

  • GCD:串行/并行/主队列下,同步/异步的执行方式

    GCD中获取各种类型的队列: 串行队列异步执行任务 异步具有创建新线程的能力,会开辟新线程去执行任务; 按照串行的...

网友评论

      本文标题:iOS for 循环内执行异步任务,但又需要串行执行。

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