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

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

  1、创建一个串行队列:

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

  2、创建一个并行队列:

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

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

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

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

 dispatch_queue_t queue = dispatch_get_main_queue();

第二、队列的使用

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

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

     dispatch_async(queue, ^{

         NSLog(@"任务1 start");
sleep();
NSLog(@"任务1 end");
}); dispatch_async(queue, ^{ NSLog(@"任务2 start");
sleep();
NSLog(@"任务2 end");
});

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

 dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
dispatch_semaphore_t semaphore =dispatch_semaphore_create();//这里指定可以同时执行的任务个数 dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务1 start");
sleep();
NSLog(@"任务1 end");
dispatch_semaphore_signal(semaphore);
}); dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务2 start");
sleep();
NSLog(@"任务2 end");
dispatch_semaphore_signal(semaphore);
}); dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务3 start");
sleep();
NSLog(@"任务3 end");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务4 start");
sleep();
NSLog(@"任务4 end");
dispatch_semaphore_signal(semaphore);
});

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

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

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

     dispatch_async(queue, ^{

         NSLog(@"任务1 start");
sleep();
NSLog(@"任务1 end");
}); dispatch_async(queue, ^{ NSLog(@"任务2 start");
sleep();
NSLog(@"任务2 end");
}); dispatch_barrier_async(queue, ^{ NSLog(@"--------------前面的并发任务执行完毕,准备执行下面的并发任务--------------");
sleep();
}); dispatch_async(queue, ^{ NSLog(@"任务3 start");
sleep();
NSLog(@"任务3 end");
}); dispatch_barrier_async(queue, ^{ NSLog(@"--------------前面的并发任务执行完毕,准备执行下面的并发任务--------------");
sleep();
}); dispatch_async(queue, ^{ NSLog(@"任务4 start");
sleep();
NSLog(@"任务4 end");
});
dispatch_async(queue, ^{ NSLog(@"任务5 start");
sleep();
NSLog(@"任务5 end");
});
dispatch_async(queue, ^{ NSLog(@"任务6 start");
sleep();
NSLog(@"任务6 end");
});

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

 dispatch_queue_t queue =dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"任务1 start");
sleep();
NSLog(@"任务1 end");
});
dispatch_group_async(group, queue, ^{
NSLog(@"任务2 start");
sleep();
NSLog(@"任务2 end");
});
dispatch_group_async(group, queue, ^{
NSLog(@"任务3 start");
sleep();
NSLog(@"任务3 end");
}); // //方法一:
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// //这里会等待group中的所有任务执行完成后才会向下执行
// NSLog(@"所有任务全部执行完毕"); //方法二:
dispatch_group_notify(group, queue, ^{ NSLog(@"所有任务全部执行完毕");
});
//这里不会等到group中所有的任务执行完成后才会向下执行
NSLog(@"所有任务还没执行完毕");

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

 dispatch_queue_t queue =dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
dispatch_semaphore_t semaphore =dispatch_semaphore_create();//这里指定可以同时执行的任务个数
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务1 start");
sleep();
NSLog(@"任务1 end");
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务2 start");
sleep();
NSLog(@"任务2 end");
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务3 start");
sleep();
NSLog(@"任务3 end");
dispatch_semaphore_signal(semaphore);
});
dispatch_group_async(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"任务4 start");
sleep();
NSLog(@"任务4 end");
dispatch_semaphore_signal(semaphore);
}); // //方法一:
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// //这里会等待group中的所有任务执行完成后才会向下执行
// NSLog(@"所有任务全部执行完毕"); //方法二:
dispatch_group_notify(group, queue, ^{ NSLog(@"所有任务全部执行完毕");
});
//这里不会等到group中所有的任务执行完成后才会向下执行
NSLog(@"所有任务还没执行完毕");

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

 - (MySingletonObj *)shareObj{

     static MySingletonObj *singleton;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//这里在整个程序的生命周期内只会执行一次
singleton =[[MySingletonObj alloc] init];
});
return singleton;
}

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

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

      NSLog(@"3秒钟到了,我开始执行了");
});

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

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

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

 //暂停
dispatch_suspend(globalQueue)
//恢复
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. hdu 1524 A Chess Game 博弈

    题目链接 给出一个有向无环图, 上面放有一些棋子, 两个人轮流移动棋子, 当一个人无法移动时, 算输. 求出每一个点的sg值, 异或就可以.出度为0的点sg值为0. #include<bits/ ...

  2. JAVA并发,经典死锁案例-哲学家就餐

    转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程 ...

  3. 转: Promises与Javascript异步编程

    在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这些年浏览器技术.HTML5以及CSS3等的发展,越来越多的富Web应用出现:在给与我们良好体验的同时,Web开发人员在背后需要处理越来越多 ...

  4. 投资新兴市场和细分市场 good

    新兴市场对程序员来说,就是一种新的语言.一个新的平台.一套新的框架.新兴市场因为刚刚兴起,所以几乎所有人都在同一个起跑线,特别适合后进者.我认识从一个2011年开始学习iOS开发的同学,他能能力中等, ...

  5. hdu 4034 Graph(逆向floyd)

    floyd的松弛部分是 g[i][j] = min(g[i][j], g[i][k] + g[k][j]);也就是说,g[i][j] <= g[i][k] + g[k][j] (存在i-> ...

  6. clistctrl 虚拟列表

    一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示 ...

  7. 线性规划问题的matlab求解

    函数:[x, fval] = linprog(f, A, b, Aeq, Beq, LB, UB) 返回的x:是一个向量——在取得目标函数最小时各个xi的取值: 返回的fval:目标函数的最小值: 参 ...

  8. MyEclipse中jsp的凝视报错解决

    jsp页面中凝视报错: 出错现场:在eclipse中没有报错.在MyEclipse中报错. <!-- To use express install, set to playerProductIn ...

  9. SQL Server索引进阶:第六级,标签

    原文地址: Stairway to SQL Server Indexes: Level 6,Bookmarks 本文是SQL Server索引进阶系列(Stairway to SQL Server I ...

  10. hdu acm 2154(多解取一解)

    //题目中结果有一条限制就是最后必须跳回A,如果我们的思想框在这个条件上就很容易卡住,因为这样的条件下的路径很难有规律的罗列,然而我们说这个图形中有三个区域,我们算出每个区域的第n-1次的种类数,然后 ...