zoukankan      html  css  js  c++  java
  • GCD Block最简单的用法

    GCD:Grand Central Dispatch。我理解的就是“宏观调控”。是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。

    首先是创建一个队列。然后在这个队列中可以执行一些方法。

    1.创建队列:

    dispatch_queue_t diq = dispatch_queue_create("CNBLOGS.COM", NULL);
    

    2.使用创建好的队列:

        dispatch_async(diq, ^{
            long long sum = 0;
            for (long long i = 0; i < 955350000; i++) {
                sum +=i;
            }
            
             });

    使用创建好的队列来计算一个很大的数的操作。(费时操作写在这里面)

    3.将计算好的数据返回到用户界面。(返回到主队列中,子队列中不可以对UI界面元素进行设置的)

    把上面第2步的代码替换成

     dispatch_async(diq, ^{
            
            long long sum = 0;
            for (long long i = 0; i < 955350000; i++) {
                sum +=i;
            }
            
           dispatch_async( dispatch_get_main_queue(), ^{
               NSLog(@"hello");
               
               label.text = @(sum).description;
    
           });
        });
    

    4.在这里是在ARC模式下,所以没有必要手动释放队列,如果是在MRC下,要把创建的队列给release 掉。

    《》《》《》《》《》《》《》《》》《》《》《》》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》《》》《》

    下面说说GCD是什么东东。

    GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。

    通过与线程池的配合,dispatch queue分为下面两种:

     Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始     

     Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。

     

    dispatch_queue_t q = dispatch_queue_create("lan.com", DISPATCH_QUEUE_SERIAL);//创建并行队列。
        dispatch_queue_t q1 = dispatch_queue_create("LAN2.COM", DISPATCH_QUEUE_CONCURRENT);//创建串行队列。
    

     而系统默认就有一个串行队列main_queue和并行队列global_queue:

        dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //获取系统中的默认的全局queue(并行队列)
    
        dispatch_queue_t main_queue = dispatch_get_main_queue();//获取系统中的串行队列。
    

      通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:

     上面提到dispatch_async这个接口,用来提交blcok给指定queue进行异步执行。这个接口会在成功提交block后立即返回,然后继续执行下去。由于block是定义在栈上的,所以需要将其复制到堆上,见这里

         与之相对应的是dispatch_sync接口,提交block以供同步执行。这个接口会等到block执行结束才返回,所以不需要复制block。So,如果在调用该接口在当前queue上指派任务,就会导致deadlock。

    什么时候使用并发的呢?

    如果追求的是并发,那么dispatch_sync有什么用呢?关于dispatch_sync的用途,SO上有讨论

     

     

    文章有的引用自:http://blog.csdn.net/onlyou930/article/details/8225906

     

  • 相关阅读:
    20171017/20171018
    BZOJ[3193] [JLOI2013]地形生成
    BZOJ[1009] [HNOI2008]GT考试
    BZOJ[4767] 两双手
    BZOJ[4013] [HNOI2015]实验比较
    BZOJ[1925] [Sdoi2010]地精部落
    20171015 杂题
    20171015
    20171014
    USACO 2015 December Contest, Gold Problem 3. Bessie's Dream
  • 原文地址:https://www.cnblogs.com/yinyakun/p/3575593.html
Copyright © 2011-2022 走看看