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

 

posted @ 2014-03-01 20:37  lanacon  Views(556)  Comments(0Edit  收藏  举报