首页 > 其他 > 详细

GCD Block最简单的用法

时间:2014-03-02 20:32:03      阅读:639      评论:0      收藏:0      [点我收藏+]

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

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

1.创建队列:

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

2.使用创建好的队列:

1
2
3
4
5
6
7
dispatch_async(diq, ^{
    long long sum = 0;
    for (long long i = 0; i < 955350000; i++) {
        sum +=i;
    }
     
     });

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。

 

1
2
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:

1
2
3
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

GCD Block最简单的用法,布布扣,bubuko.com

GCD Block最简单的用法

原文:http://www.cnblogs.com/yinyakun/p/3575593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!