五线程管理————GCD
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五线程管理————GCD相关的知识,希望对你有一定的参考价值。
本文只对GCD的其他操作进行一些补充。
1、延迟操作
实例:
//延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
/*
dispatch_after的参数
参数1 dispatch_time_t when
多少纳秒之后执行
参数2 dispatch_queue_t queue
任务添加到那个队列
参数3 dispatch_block_t block
要执行的任务
*/
2、一次性执行
(1)定义:程序运行中只执行一次。一次性执行是线程安全的,可以使用一次性执行创建单例对象,效率比互斥锁高。
(2)实现:可以用来创建单例对象。
//原理:当onceToken为0时执行方法,然后将全局变量oneceToken更改为-1,以后就无法再执行。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//要执行一次的代码;
});
3、调度组
(1)定义:有时候需要在多个异步任务都执行完成之后继续做某些事情,比如下载歌曲,等所有的歌曲都下载完毕之后转到主线程提示用户,这样需要一个顺序的统一调度。
(2)实现:
//1 全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2 调度组
dispatch_group_t group = dispatch_group_create();
//3 添加任务
//把任务添加到队列,等任务执行完成之后通知调度组,任务是异步执行
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲1下载完毕 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲2下载完毕 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲3下载完毕 %@",[NSThread currentThread]);
});
//4 所有任务都执行完成后,获得通知 (异步执行)
//等调度组中队列的任务完成后,把block添加到指定的队列
dispatch_group_notify(group, queue, ^{
NSLog(@“所有歌曲都已经下载完毕! %@",[NSThread currentThread]);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//在主线程,更新UI控件,提示用户
NSLog(@“播放器更新完毕! %@",[NSThread currentThread]);
});
NSLog(@"over");
(3)原理:
//1 全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2 调度组
dispatch_group_t group = dispatch_group_create();
//ARC中不用写
// dispatch_retain(group);
//3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听
dispatch_group_enter(group);
//4 添加任务一
dispatch_async(queue, ^{
NSLog(@“下载第一首歌曲!”);
dispatch_group_leave(group);
//ARC中此行不用写,也不能写
// dispatch_release(group);
});
//5 添加任务二
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@“下载第二首歌曲”);
dispatch_group_leave(group);
//ARC中此行不用写,也不能写
//dispatch_release(group);
});
//6 获得调度组的通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@“歌曲都已经下载完毕! %@",[NSThread currentThread]);
});
//7 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用)
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
以上是关于五线程管理————GCD的主要内容,如果未能解决你的问题,请参考以下文章