美文网首页
iOS 线程列队依赖

iOS 线程列队依赖

作者: 一条鱼的星辰大海 | 来源:发表于2020-09-09 14:55 被阅读0次

iOS的日常业务开发中,有的时候会出现诸如任务C和D要等待任务A和B结束,需要A和B的数据支持,此类的线程列队依赖场景。
以下列举三种常用的方法供大家学习参考。

1.信号量dispatch_semaphore

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue, ^{
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    dispatch_async(queue, ^{
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"run task 4");
        sleep(1);
        NSLog(@"complete task 4");
    });
2020-09-09 14:55:00.023807+0800 Test[8144:782166] run task 1
2020-09-09 14:55:00.023807+0800 Test[8144:782169] run task 2
2020-09-09 14:55:01.024233+0800 Test[8144:782169] complete task 2
2020-09-09 14:55:01.024233+0800 Test[8144:782166] complete task 1
2020-09-09 14:55:01.024651+0800 Test[8144:782169] run task 3
2020-09-09 14:55:01.024673+0800 Test[8144:782166] run task 4
2020-09-09 14:55:02.029937+0800 Test[8144:782169] complete task 3
2020-09-09 14:55:02.029957+0800 Test[8144:782166] complete task 4

2.栅栏函数dispatch_barrier

dispatch_queue_t concurrentQueue = dispatch_queue_create("EpisodeConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
    });
    
    dispatch_barrier_async(concurrentQueue, ^{
        dispatch_async(concurrentQueue, ^{
            NSLog(@"run task 3");
            sleep(1);
            NSLog(@"complete task 3");
        });
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"run task 4");
        sleep(1);
        NSLog(@"complete task 4");
    });
2020-09-09 15:00:29.198272+0800 Test[8162:786325] run task 2
2020-09-09 15:00:29.198257+0800 Test[8162:786323] run task 1
2020-09-09 15:00:30.198572+0800 Test[8162:786325] complete task 2
2020-09-09 15:00:30.198572+0800 Test[8162:786323] complete task 1
2020-09-09 15:00:30.199012+0800 Test[8162:786323] run task 4
2020-09-09 15:00:30.199018+0800 Test[8162:786325] run task 3
2020-09-09 15:00:31.202372+0800 Test[8162:786325] complete task 3
2020-09-09 15:00:31.202352+0800 Test[8162:786323] complete task 4

3. NSOperation的添加线程依赖addDependency

NSOperationQueue *episodeQueue = [[NSOperationQueue alloc] init];
    
    NSOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
    }];
    
    NSOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
    }];
    
    NSOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
    }];
    
    NSOperation *operationD = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"run task 4");
        sleep(1);
        NSLog(@"complete task 4");
    }];
    
    [operationC addDependency:operationA];
    [operationC addDependency:operationB];
    [operationD addDependency:operationA];
    [operationD addDependency:operationB];
    
    [episodeQueue addOperation:operationA];
    [episodeQueue addOperation:operationB];
    [episodeQueue addOperation:operationC];
    [episodeQueue addOperation:operationD];
2020-09-09 15:16:19.344610+0800 Test[8256:796436] run task 1
2020-09-09 15:16:19.344622+0800 Test[8256:796440] run task 2
2020-09-09 15:16:20.349042+0800 Test[8256:796436] complete task 1
2020-09-09 15:16:20.349069+0800 Test[8256:796440] complete task 2
2020-09-09 15:16:20.349623+0800 Test[8256:796438] run task 4
2020-09-09 15:16:20.349629+0800 Test[8256:796440] run task 3
2020-09-09 15:16:21.354678+0800 Test[8256:796440] complete task 3
2020-09-09 15:16:21.354678+0800 Test[8256:796438] complete task 4

相关文章

  • iOS 线程列队依赖

    iOS的日常业务开发中,有的时候会出现诸如任务C和D要等待任务A和B结束,需要A和B的数据支持,此类的线程列队依赖...

  • iOS线程依赖

    1.线程依赖.目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 ...

  • iOS 多线程之间有依赖时的处理方式

    iOS 多线程之间有依赖时的处理方式

  • 如何自定义NSOperation

    在iOS中使用线程主要是GCD,和NSOperation 两种方式。 GCD 对线程依赖,线程取消支持的不是很好,...

  • iOS 线程同步和线程依赖

    相关概念 线程同步:不同线程下的任务要做到完成最终监听。适合所有任务都完成才能进行下一步的情况下。 线程依赖:即线...

  • 底层原理:多线程

    iOS中常见多线程方案 NSThread 、 GCD 和 NSOperation 底层都是依赖于 pthread ...

  • iOS-多线程1-GCD

    首先看一下iOS中多线程的实现方案 这些多线程方案的底层都是依赖pthread NSThread线程生命周期是程序...

  • iOS-面试题3-多线程

    目录: GCD 加锁方案 一. GCD 说一下iOS中多线程的实现方案 ① 这些多线程方案的底层都是依赖pthre...

  • iOS swift 多线程依赖

    记录一个可能会遇到的应用场景 当前有a,b,c,d,e,f六个任务,要求: a,b,c并发执行 d依赖a,b e依...

  • iOS多线程相关面试题

    iOS多线程demo iOS多线程之--NSThread iOS多线程之--GCD详解 iOS多线程之--NSOp...

网友评论

      本文标题:iOS 线程列队依赖

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