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. // // //------------------------- ...
随机推荐
- mssql索引使用情况查询
可通过查询dm_db_index_usage_stats表取得对应表索引被使用次数. 列名 数据类型 说明 database_id smallint 在其中定义表或视图的数据库的 ID. object ...
- linux服务器在运行210天左右宕机
减小字体 增大字体 作者:错新网 来源:www.cuoxin.com 发布时间:2014-2-25 19:21:32 错新网讯 最近几天,一批linux线上的服务器接连宕机,当时以为是硬件问题 ...
- rsyslog 直接读取日志,当日志截断后,不会继续发送
rsyslog web机器上日志被截断,那么就不会发送到rsyslog服务器 因为imfile记录了offset,然后你直接>导致offset还没到
- 第25周五迷茫定位&转行理论建议
今天下午请假办了无房证明和单身证明,准备开始贷款买房的征程,在犹豫纠结中我选择推进这个事情,之前的经验告诉我生活中可以面临改变或不改变境况的选择是要尽可能的选择改变,因为我还年轻.回来后知乎上看了一个 ...
- 【iOS知识学习】_如何判断手机是否为静音模式
目前我涉及的app要获取系统是否为静音模式,到网上搜了一下,千篇一律的都是一样的,而且都是iOS5.0以前才适应的知识,这个大家去搜一下就会很容易发现,找了很久终于找到一个5.0以后适用的,那位大神的 ...
- SSIS Package 配置多数据库连接语句
- 七日筑基——C#第二天
上一次讲到了变量,变量这个东西可以说是编程的基础,主要的作用就是用来存放数据,就跟做菜一样的,不同的菜要放在不同类型的容器中,那么不同的数据也需要存放在不同类型的变量里.先放张饭菜的图给大家看看,增加 ...
- Java中this和super的用法总结
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...
- [Jobdu] 题目1511:从尾到头打印链表——单链表的倒置输出
// ListNode typedef struct LNode { int key; struct LNode *next; }LNode; 分析:这是一道很有意思的面试题,此题以及此题的变体经 ...
- UVa12563(DP)
题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长. 该题类似于01背包问题,可用01背包问题的解题思路来求,每个歌曲相当于物品,歌曲的长度相等于物品重量,每个歌曲的“价值”为 ...