09、GCD的其他操作

1、延迟加载
// dispatch_time_t when, 延迟多长时间 精度到纳秒
// dispatch_queue_t queue, 队列
// dispatch_block_t block 任务

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"task");
});


2、一次性执行
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"hello %@",[NSThread currentThread]);
});

一次性执行的原理:判断静态的全局变量的值 默认是0,如果执行完成后,设置为-1
once内部会判断变量的值,如果是0才执行


3、调度组
//演示调度组的基本使用
- (void)demo1 {
//创建组
dispatch_group_t group = dispatch_group_create();
//队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//下载第一首歌曲
dispatch_group_async(group, queue, ^{
NSLog(@"正在下载第一个歌曲");

});
//下载第二首歌曲
dispatch_group_async(group, queue, ^{
NSLog(@"正在下载第二个歌曲");
[NSThread sleepForTimeInterval:2.0];
});
//下载第三首歌曲
dispatch_group_async(group, queue, ^{
NSLog(@"正在下载第三个歌曲");
});
//当三个异步任务都执行完成,才执行
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"over %@",[NSThread currentThread]);
});
}

//调度组内部的原理
- (void)demo2 {
//创建组
dispatch_group_t group = dispatch_group_create();
//创建队列
dispatch_queue_t queue = dispatch_queue_create("hm", DISPATCH_QUEUE_CONCURRENT);
//任务1
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"任务1");
dispatch_group_leave(group);
});
//任务2
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"任务2");
dispatch_group_leave(group);
});
//任务3
dispatch_group_enter(group);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"任务3");
dispatch_group_leave(group);
});

//等待组中的任务都执行完毕,才会执行
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"over");
});
//等待组中的任务都执行完毕,才会继续执行后续的代码
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"hello ");
}


你可能感兴趣的:(OC多线程)