带你系统学习GCD(一)

欢迎走进夏天的Coding世界.

今天分享的关于GCD的知识, 对于GCD的说明: 开发者要做的知识定义想要执行的任务并对家到适当的Dispatch Queue中.

存在两种Dispatch Queue 见下表
Dispatch Queue的种类 说明
Serial Dispatch Queue 等待现在执行中处理结束
Concurrent Dispatch Queue 不等待现在执行中处理结束

带你系统学习GCD(一)_第1张图片
Serial Dispatch Queue 使用一个线程
Concurrent Dispatch Queue 使用多个线程

1. 创建线程 dispatch_queue_create
    /** 第一个参数指定, 线程的名称: 可以给NULL 该名称会出现在应用程序崩溃时所生成的CrashLog中, 所以最好给上名称 第二个参数指定, NULL(Serial Dispatch Queue), 或者 Concurrent Dispatch Queue. */
    // dispatch_queue_t 代表线程类型 
dispatch_queue_t queue = dispatch_queue_create("my.gcd.example", NULL);
2. Main Dispatch Queue / Global Dispatch Queue

Main Dispatch Queue 像他的名字含有Main一样, 是在主线程中执行的Dispatch Queue因为主线程只有一个, 所以他是Serial Dispatch Queue

Global Dispatch Queue 是所有是所有应用程序都能使用的Concurrent Dispatch Queue.
Global Dispatch Queue 有四个优先级别: High, Default, Low, Background(后台)

各种Dispatch Queue 获取方法如下

// man
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// global
// DISPATCH_QUEUE_PRIORITY_HIGH
// DISPATCH_QUEUE_PRIORITY_DEFAULT
// DISPATCH_QUEUE_PRIORITY_LOW
// DISPATCH_QUEUE_PRIORITY_BACKGROUND
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
3. dispatch_after

经常会有这样的情况, 想在3秒之后执行处理 可能不限于3秒, 使用dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // do you something
    });
4. Dispatch Group

在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理, 这种应该如何处理呢?? 使用 group
假设你想, 追加3个Block 到Global Dispatch Queue 这些Block全部执行完, 执行 Main Dispatch 中结束处理用的Block

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{
        //
        NSLog(@"-------------1");
    });
    dispatch_group_async(group, queue, ^{
        //
        NSLog(@"-------------2");
    });
    dispatch_group_async(group, queue, ^{
        //
        NSLog(@"-------------3");
    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"-------------4");
    });
// 2016-05-08 02:02:56.376 GCD-01[3223:59296] -------------1
// 2016-05-08 02:02:56.376 GCD-01[3223:59298] -------------3
// 2016-05-08 02:02:56.376 GCD-01[3223:59297] -------------2
// 2016-05-08 02:02:56.385 GCD-01[3223:59213] -------------4

因为多个线程并行执行 所以追加的处理执行的顺序是不确定的, 但是4 一定是最后执行.
无论向什么样的 Dispatch Queue 中追加处理, 使用Dispatch Group 都可以监视这些处理的结束, 一旦所有的都结束执行, 就可以加结束的处理追加到Dispatch Queue, 这就是Gourp的奥义.

dispatch_group_wait
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // 永久等待

// 具体使用代码如下
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{
        //
        NSLog(@"-------------1");
    });
    dispatch_group_async(group, queue, ^{
        //
        for (int i = 0; i < 2000; i ++) {
            NSLog(@"%d", i);
        }

        NSLog(@"-------------2");
    });
    dispatch_group_async(group, queue, ^{
        //
        NSLog(@"-------------3");
    });

    dispatch_time_t time1 = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);

    long result = dispatch_group_wait(group, time1);

    if (result == 0) {
        NSLog(@"全部处理结束");
    }else{
        NSLog(@"还在处理中");
    }
// 2016-05-08 02:19:16.102 GCD-01[3376:65810] 1222
// 2016-05-08 02:19:16.102 GCD-01[3376:65742] 还在处理中
// 2016-05-08 02:19:16.103 GCD-01[3376:65810] 1223

今天先到这里 每天进步一点也是收获, 看到这里请点赞喔 0.O
原文链接

你可能感兴趣的:(ios,gcd)