GCD详细使用笔记
第一、通过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详细使用笔记的更多相关文章
- Hbase技术详细学习笔记
注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- MySQL 详细学习笔记 转
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- 一千行 MySQL 详细学习笔记
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- MySQL 详细学习笔记
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- stl源码剖析 详细学习笔记 set map
// // set map.cpp // 笔记 // // Created by fam on 15/3/23. // // //---------------------------15/03 ...
- stl源码剖析 详细学习笔记 RB_tree (2)
//---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多 ...
- stl源码剖析 详细学习笔记 RB_tree (1)
// // RB_tree_STL.cpp // 笔记 // // Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...
- stl源码剖析 详细学习笔记priority_queue slist
// // priority_queue.cpp // 笔记 // // Created by fam on 15/3/16. // // //------------------------- ...
随机推荐
- JQ插件开发方法
由于项目原因,不得不写个JQ侧滑插件来满足需求.. 先引用两篇博文,待测试了 再写怎么做.. http://blog.csdn.net/business122/article/details/8278 ...
- uva 563 - Crimewave 网络流
题目链接 有一个n*m的图, 里面有q个人, 每个点只能走一次, 问这q个人是否都能够走出这个图. 对于每个人, 建边(s, u, 1), 对于每个边界的格子, 建边(u', t, 1), 对于其他格 ...
- 树莓派高级GPIO库,wiringpi2 for python使用笔记(二)高精度计时、延时函数
学过单片机的同学应该清楚,我们在编写传感器驱动时,需要用到高精度的定时器.延时等功能,wiringpi提供了一组函数来实现这些功能,这些函数分别是: micros() #返回当前的微秒数,这个数在调用 ...
- SVN权限配置
初始化SVN仓库后,里面有以下文件. 其中conf是对授权.认证进行管理的,conf目录里的内容有: passwd设立账户密码: authz权限管理: 假设pwd里有user1,user2两个账户 @ ...
- Linux 中执行命令
第一步: 在txt文件(文件名为cmd_file)中写入代码:echo this is content! 第二步: 授权chmod 555 cmd_file 第三步: 运行 ./cmd_file -- ...
- LINUX诞生
编辑 Linux[1] 是一类Unix计算机操作系统的统称.Linux操作系统也是自由软件和开放源代码发展中最著名的例子.在1991 年的十月,由一个名为 Linus Torvalds的年轻芬兰大学 ...
- HortonWorks
http://zh.hortonworks.com/products/hortonworks-sandbox/
- ubuntu 12.04下安装和配置kohana 3.3.3 的方法
一.先到官网下载3.3.3版本的压缩包到/var/www/1117/目录下(提前建好1117的目录)解压 解压好的文件有(applications\modules\system\build.xml\c ...
- Java程序栈信息文件中的秘密(五)
最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切 ...
- MYSQL++之Connect类型
原文转自:www.cnblogs.com/aicro mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话). 该类型的主要的结果如下所示 m ...