美文网首页
GCD的几种使用方法

GCD的几种使用方法

作者: 小白也疯狂 | 来源:发表于2020-06-12 17:01 被阅读0次

1.栅栏方法:

- (void)queue1 {
    dispatch_queue_t queue = dispatch_queue_create("aaaaaa", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:1]; NSLog(@"1---%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 5; ++i) {
            [NSThread sleepForTimeInterval:1]; NSLog(@"2---%@",[NSThread currentThread]);
        }
    });
    //dispatch_barrier_async
    dispatch_barrier_async(queue, ^{
        for (int i = 0; i < 4; ++i) {
            [NSThread sleepForTimeInterval:1]; NSLog(@"3---%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 3; ++i) {
            [NSThread sleepForTimeInterval:1]; NSLog(@"4---%@",[NSThread currentThread]);
        }
    });
}

2.快速迭代

- (void)queue2 {
    dispatch_queue_t queue = dispatch_queue_create("bbbbbb", DISPATCH_QUEUE_CONCURRENT);
    //dispatch_apply
    dispatch_apply(5, queue, ^(size_t index) {
        NSLog(@"-----%ld----%@",index,[NSThread currentThread]);
    });
    NSLog(@"完成");
}

3.信号量

@property (nonatomic, assign) NSInteger number;
@property (nonatomic, strong) dispatch_semaphore_t semp;

- (void)queue3 {
    self.number = 50;
    dispatch_queue_t queue1 = dispatch_queue_create("cccccc", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("dddddd", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("eeeeee", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue4 = dispatch_queue_create("ffffff", DISPATCH_QUEUE_SERIAL);
    //创建
    self.semp = dispatch_semaphore_create(1);
    __weak typeof(self)wekeSelf = self;
    dispatch_async(queue1, ^{
        [wekeSelf queue4];
    });
    dispatch_async(queue2, ^{
        [wekeSelf queue4];
    });
    dispatch_async(queue3, ^{
        [wekeSelf queue4];
    });
    dispatch_async(queue4, ^{
        [wekeSelf queue4];
    });
}
- (void)queue4 {
    while (1) {
        //-1
        dispatch_semaphore_wait(self.semp, DISPATCH_TIME_FOREVER);
        if (self.number > 0) {
            NSLog(@"----%ld----%@",self.number,[NSThread currentThread]);
            self.number --;
        } else {
            NSLog(@"完成");
            break;
        }
        //+1
        dispatch_semaphore_signal(self.semp);
    };
}

相关文章

  • GCD的几种使用方法

    1.栅栏方法: 2.快速迭代 3.信号量

  • Grand Central Dispatch(GCD)编程基础

    本文介绍iOS 多线程中 GCD 的相关知识以及使用方法。通过本文可以了解到: GCD 简介 GCD 任务和队列 ...

  • iOS 多线程面试题(GCD---队列)

    GCD---队列 iOS中,有GCD、NSOperation、NSThread等几种多线程技术方案。 而GCD共有...

  • iOS多线程 - GCD

    本文用来介绍 iOS 多线程中 GCD的相关知识以及使用方法。通过本文,您将了解到:GCD 简介GCD 任务和队列...

  • iOS多线程之GCD浅析

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法,分析GCD的原理,总结GCD的用法和需要注意的地方...

  • iOS 多线程

    iOS 多线程有几种方式 GCD NSOpeartion NSThread phread 多线程 GCD disp...

  • iOS面试--GCD常见用法

    项目中常见的GCD用法有已下几种: 1.GCD栅栏函数2.GCD快速迭代(遍历)3.GCD队列组的使用 1.GCD...

  • iOS 多线程-GCD 详细总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。1. GCD 简介2. GCD 任务和队列3. G...

  • 关于 GCD 使用

    1、队列 iOS 中,有 GCD、NSOperation、NSThread 等几种多线程技术方案。而 GCD 共有...

  • GCD学习(二)

    GCD学习一 GCD学习二 GCD学习三 一。队列有哪几种呢? 1.1、自定义的队列 :dispatch_queu...

网友评论

      本文标题:GCD的几种使用方法

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