第一、通过GCD创建队列(Queue)  

创建队列方式有以下几种:

  1、创建一个串行队列:

  1. dispatch_queue_t queue =dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);

  2、创建一个并行队列:

  1. dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);

  3、获取一个全局的队列:

  1. // 第1个参数表示队列执行的优先级:
  2. // DISPATCH_QUEUE_PRIORITY_HIGH-高优先级
  3. // DISPATCH_QUEUE_PRIORITY_DEFAULT-中优先级
  4. // DISPATCH_QUEUE_PRIORITY_LOW-低优先级
  5. // DISPATCH_QUEUE_PRIORITY_BACKGROUND-最低优先级
  6. // 第2个参数暂不支持,传0即可;
  7. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

  4、获取一个运行在主线程中的队列:

  1. dispatch_queue_t queue = dispatch_get_main_queue();

第二、队列的使用

1、执行一个串行队列:串行队列的特点是当前一个任务执行完毕后,后一个任务才开始执行。

  1. dispatch_queue_t queue =dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
  2.  
  3. dispatch_async(queue, ^{
  4.  
  5. NSLog(@"任务1 start");
  6. sleep();
  7. NSLog(@"任务1 end");
  8. });
  9.  
  10. dispatch_async(queue, ^{
  11.  
  12. NSLog(@"任务2 start");
  13. sleep();
  14. NSLog(@"任务2 end");
  15. });

2、执行一个并行队列:并行队列的特点是可以同时执行多个任务,在执行并行队列的时候,利用了信号量来控制同时执行的线程个数。

  1. dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_semaphore_t semaphore =dispatch_semaphore_create();//这里指定可以同时执行的任务个数
  3.  
  4. dispatch_async(queue, ^{
  5.  
  6. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  7. NSLog(@"任务1 start");
  8. sleep();
  9. NSLog(@"任务1 end");
  10. dispatch_semaphore_signal(semaphore);
  11. });
  12.  
  13. dispatch_async(queue, ^{
  14.  
  15. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  16. NSLog(@"任务2 start");
  17. sleep();
  18. NSLog(@"任务2 end");
  19. dispatch_semaphore_signal(semaphore);
  20. });
  21.  
  22. dispatch_async(queue, ^{
  23.  
  24. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  25. NSLog(@"任务3 start");
  26. sleep();
  27. NSLog(@"任务3 end");
  28. dispatch_semaphore_signal(semaphore);
  29. });
  30. dispatch_async(queue, ^{
  31.  
  32. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  33. NSLog(@"任务4 start");
  34. sleep();
  35. NSLog(@"任务4 end");
  36. dispatch_semaphore_signal(semaphore);
  37. });

3、执行一个并行队列:上面我们已经讲述了如何执行一个并行队列,并且指定并行任务最大个数,那么下面还有一个方法可以实现,就是利用

dispatch_barrier_async(并行队列中设置分界线),分界线的作用就是,将一组并行任务切割成多组并行任务顺序执行。我们也经常使用它来解决由于并发导致的数据不同步问题。

  1. dispatch_queue_t queue = dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
  2.  
  3. dispatch_async(queue, ^{
  4.  
  5. NSLog(@"任务1 start");
  6. sleep();
  7. NSLog(@"任务1 end");
  8. });
  9.  
  10. dispatch_async(queue, ^{
  11.  
  12. NSLog(@"任务2 start");
  13. sleep();
  14. NSLog(@"任务2 end");
  15. });
  16.  
  17. dispatch_barrier_async(queue, ^{
  18.  
  19. NSLog(@"--------------前面的并发任务执行完毕,准备执行下面的并发任务--------------");
  20. sleep();
  21. });
  22.  
  23. dispatch_async(queue, ^{
  24.  
  25. NSLog(@"任务3 start");
  26. sleep();
  27. NSLog(@"任务3 end");
  28. });
  29.  
  30. dispatch_barrier_async(queue, ^{
  31.  
  32. NSLog(@"--------------前面的并发任务执行完毕,准备执行下面的并发任务--------------");
  33. sleep();
  34. });
  35.  
  36. dispatch_async(queue, ^{
  37.  
  38. NSLog(@"任务4 start");
  39. sleep();
  40. NSLog(@"任务4 end");
  41. });
  42. dispatch_async(queue, ^{
  43.  
  44. NSLog(@"任务5 start");
  45. sleep();
  46. NSLog(@"任务5 end");
  47. });
  48. dispatch_async(queue, ^{
  49.  
  50. NSLog(@"任务6 start");
  51. sleep();
  52. NSLog(@"任务6 end");
  53. });

4、执行一个串行队列,并且我想知道这组队列什么时候执行完毕:

  1. dispatch_queue_t queue =dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
  2. dispatch_group_t group =dispatch_group_create();
  3. dispatch_group_async(group, queue, ^{
  4. NSLog(@"任务1 start");
  5. sleep();
  6. NSLog(@"任务1 end");
  7. });
  8. dispatch_group_async(group, queue, ^{
  9. NSLog(@"任务2 start");
  10. sleep();
  11. NSLog(@"任务2 end");
  12. });
  13. dispatch_group_async(group, queue, ^{
  14. NSLog(@"任务3 start");
  15. sleep();
  16. NSLog(@"任务3 end");
  17. });
  18.  
  19. // //方法一:
  20. // dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  21. // //这里会等待group中的所有任务执行完成后才会向下执行
  22. // NSLog(@"所有任务全部执行完毕");
  23.  
  24. //方法二:
  25. dispatch_group_notify(group, queue, ^{
  26.  
  27. NSLog(@"所有任务全部执行完毕");
  28. });
  29. //这里不会等到group中所有的任务执行完成后才会向下执行
  30. NSLog(@"所有任务还没执行完毕");

5、执行一个并行队列,并且我想知道这组队列什么时候执行完毕:

  1. dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_semaphore_t semaphore =dispatch_semaphore_create();//这里指定可以同时执行的任务个数
  3. dispatch_group_t group =dispatch_group_create();
  4. dispatch_group_async(group, queue, ^{
  5.  
  6. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  7. NSLog(@"任务1 start");
  8. sleep();
  9. NSLog(@"任务1 end");
  10. dispatch_semaphore_signal(semaphore);
  11. });
  12. dispatch_group_async(group, queue, ^{
  13.  
  14. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  15. NSLog(@"任务2 start");
  16. sleep();
  17. NSLog(@"任务2 end");
  18. dispatch_semaphore_signal(semaphore);
  19. });
  20. dispatch_group_async(group, queue, ^{
  21.  
  22. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  23. NSLog(@"任务3 start");
  24. sleep();
  25. NSLog(@"任务3 end");
  26. dispatch_semaphore_signal(semaphore);
  27. });
  28. dispatch_group_async(group, queue, ^{
  29.  
  30. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  31. NSLog(@"任务4 start");
  32. sleep();
  33. NSLog(@"任务4 end");
  34. dispatch_semaphore_signal(semaphore);
  35. });
  36.  
  37. // //方法一:
  38. // dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  39. // //这里会等待group中的所有任务执行完成后才会向下执行
  40. // NSLog(@"所有任务全部执行完毕");
  41.  
  42. //方法二:
  43. dispatch_group_notify(group, queue, ^{
  44.  
  45. NSLog(@"所有任务全部执行完毕");
  46. });
  47. //这里不会等到group中所有的任务执行完成后才会向下执行
  48. NSLog(@"所有任务还没执行完毕");

第三、利用GCD实现单例模式

  1. - (MySingletonObj *)shareObj{
  2.  
  3. static MySingletonObj *singleton;
  4. static dispatch_once_t onceToken;
  5. dispatch_once(&onceToken, ^{
  6. //这里在整个程序的生命周期内只会执行一次
  7. singleton =[[MySingletonObj alloc] init];
  8. });
  9. return singleton;
  10. }

第四、利用GCD实现一个定时任务

  1. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  2.  
  3. NSLog(@"3秒钟到了,我开始执行了");
  4. });

第五、利用GCD实现一个循环操作:这个方法是同步运行的,类似于for循环

  1. dispatch_queue_t queue =dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
  2. // dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
  3. dispatch_apply(, queue, ^(size_t index) {
  4.  
  5. //注意:如果queue是串行队列,那么index是按照0、1、2、3、4的顺序执行
  6. // 如果queue是并行队列,那么index就不一定是按照顺序执行了
  7. NSLog(@"%@", @(index));
  8. });

第六、某些情况下,我们可能会想让Queue暂时停止一下,然后在某个时刻恢复处理,这时就可以使用dispatch_suspend以及dispatch_resume函数。暂停时,如果已经有block正在执行,那么不会对该block的执行产生影响。dispatch_suspend只会对还未开始执行的block产生影响。

  1. //暂停
  2. dispatch_suspend(globalQueue)
  3. //恢复
  4. dispatch_resume(globalQueue)

以上是关于GCD中常用的一些函数和用法,其他方面有兴趣的可以到官网了解具体使用。

GCD详细使用笔记的更多相关文章

  1. Hbase技术详细学习笔记

    注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...

  2. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  3. MySQL 详细学习笔记 转

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  4. 一千行 MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  5. MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  6. stl源码剖析 详细学习笔记 set map

    // //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03 ...

  7. stl源码剖析 详细学习笔记 RB_tree (2)

    //---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多 ...

  8. stl源码剖析 详细学习笔记 RB_tree (1)

    // //  RB_tree_STL.cpp //  笔记 // //  Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...

  9. stl源码剖析 详细学习笔记priority_queue slist

    // //  priority_queue.cpp //  笔记 // //  Created by fam on 15/3/16. // // //------------------------- ...

随机推荐

  1. Naive Bayes Theorem and Application - Theorem

    Naive Bayes Theorm And Application - Theorem Naive Bayes model: 1. Naive Bayes model 2. model: discr ...

  2. mac定时任务

    <?xml version=”1.0″ encoding=”UTF-8″?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” ...

  3. Google AdSense的CPC点击单价超百度联盟(2014)

    很久没有关注AdSense了,一是访问不太方便,二是网站投放AdSense广告相当少,估计每天收入都不到1美元,所以就懒得去看了,一般都是几个月才去看一看. AdSense还行吗? AdSense点击 ...

  4. 菱形java代码

    public class boy { //菱形 public static void main(String[] args) { int m=4; for (int i=0;i<=m;i++){ ...

  5. c#SocketIO4NetClient访问node js

    提到Node,不能错过的是WebSocket协议.它与Node之间的配合堪称完美,其理由有两条. 1.WebSocket客户端基于时间的编程模型与Node中自定义事件相差无几. 2.WebSocket ...

  6. openssl命令行Base64编解码

    openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...

  7. Android仿人人客户端(v5.7.1)——个人主页(三)

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/9405089 声明:仿人人项目,所用所有图片资源都来源于其它Android移动应用,编 ...

  8. nbtstat 查询IP地址对应的计算机名称

    使用命令nbtstat -a ipaddress即可,例如:nbtstat -a 192.168.1.2.

  9. error 和 exception 有什么区别?

    1.error指恢复不是不可能但非常困难的情况下的一种严重错误.比如内存溢出,不指望程序可以处理这样的情况. 2.exception表示一种设计或者实现问题,如果程序正常运行,则从不会发生.

  10. ubuntu下使用codeblocks

    集成开发环境搭建 1. 安装build-essential 方法: sudo apt-get install build-essential 作用:提供编译程序必须软件包的列表信息,编译程序有了这个软 ...