美文网首页
GCD的常用方法

GCD的常用方法

作者: 云边画月 | 来源:发表于2017-03-07 23:01 被阅读0次

    一. 队列的创建方法

    可以使用dispatch_queue_create来创建对象,需要传入两个参数,第一个参数表示队列的唯一标识符,用于DEBUG,可为空;第二个参数用来识别是串行队列还是并发队列。DISPATCH_QUEUE_SERIAL表示串行队列,DISPATCH_QUEUE_CONCURRENT表示并发队列。

    // 串行队列的创建方法
    dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
    // 并发队列的创建方法
    dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
    

    二. 任务的创建方法

    // 同步执行任务创建方法
    dispatch_sync(queue, ^{
    NSLog(@"%@",[NSThread currentThread]);    // 这里放任务代码});
    // 异步执行任务创建方法
    dispatch_async(queue, ^{
    NSLog(@"%@",[NSThread currentThread]);    // 这里放任务代码});
    

    虽然使用GCD只需两步,但是既然我们有两种队列,两种任务执行方式,那么我们就有了四种不同的组合方式。这四种不同的组合方式是

    • 并发队列 + 同步执行
    • 并发队列 + 异步执行
    • 串行队列 + 同步执行
    • 串行队列 + 异步执行

    实际上,我们还有一种特殊队列是主队列,那样就有六种不同的组合方式了。

    • 主队列 + 同步执行
    • 主队列 + 异步执行

    那么这几种不同组合方式各有什么区别呢,这里为了方便,先上结果,再来讲解。为图省事,直接查看表格结果,然后可以跳过 4. GCD的基本使用 了。

    三. GCD的基本使用

    先来讲讲并发队列的两种使用方法。

    1. 并发队列 + 同步执行

    不会开启新线程,执行完一个任务,再执行下一个任务
    - (void) syncConcurrent{
    NSLog(@"syncConcurrent---begin");

    dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_sync(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"1------%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"2------%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"3------%@",[NSThread currentThread]);
        }
    });
    NSLog(@"syncConcurrent---end");
    }
    
    • 并发队列 + 同步执行,所有任务都是在主线程中执行的。由于只有一个线程,所以任务只能一个一个执行。同时任务是添加到队列中马上执行的。

    2.并发队列 + 异步执行

    可同时开启多线程,任务交替执行
    - (void) asyncConcurrent{
    NSLog(@"asyncConcurrent---begin");

    dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"1------%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"2------%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 2; ++i) {
            NSLog(@"3------%@",[NSThread currentThread]);
        }
    });
    NSLog(@"asyncConcurrent---end");
    }
    
    • 并发队列 + 异步执行,除了主线程,会开启了多个个线程,并且任务是交替着同时执行的。
    • 另一方面所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。任务不是马上执行,而是将所有任务添加到队列之后才开始异步执行。

    3.串行队列 + 同步执行

    • 不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务
    • 串行队列 + 同步执行,所有任务都是在主线程中执行的,并没有开启新的线程。而且由于串行队列,所以按顺序一个一个执行。所有任务是添加到队列中马上执行的。

    4. 串行队列 + 异步执行

    • 会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务
    • 串行队列 + 异步执行,开启了一条新线程,但是任务还是串行,所以任务是一个一个执行。
    • 所有任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。

    备注:文章摘自“行走的少年郎”,欢迎关注原作者。

    相关文章

      网友评论

          本文标题:GCD的常用方法

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