码迷,mamicode.com
首页 > 其他好文 > 详细

带你系统学习GCD(一)

时间:2016-05-08 06:52:57      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

欢迎走进夏天的Coding世界.

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

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

技术分享
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
原文链接

带你系统学习GCD(一)

标签:

原文地址:http://blog.csdn.net/sinat_30162391/article/details/51341059

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!