在开发中遇到过这样一个功能,某个界面列表上面是企业,下面是联系人,而且获取企业列表与联系人列表的接口不是同一个,必须等企业跟联系人列表数据都获取完毕后才能刷新,于是就用到了GCD组函数。
![](https://img.haomeiwen.com/i1599548/a0f00e5a9c14d818.png)
然而问题来了,[[IBOSServer shared]...]这玩意儿是封装好的,并且是个异步函数,而异步函数不会阻塞线程,不会等里面的内容执行完,就直接返回了,这就导致数据还没拿到,就开始执行notify里面的代码了。这时需要使用另一种GCD组函数的用法,完美解决问题。
![](https://img.haomeiwen.com/i1599548/0c13f1ddbe0bfe81.png)
另外:
1、延时执行
- (void)demo{
// 方法1 timer
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(task) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 方法2
[self performSelector:@selector(task) withObject:nil afterDelay:3];
// 方法3
/**
*参数1:延时时间 dispatch_time生成时间 纳秒为计时单位 精度高
*参数2:队列
*参数3:任务
*异步执行
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
NSLog(@"task");
});
NSLog(@"over");
}
- (void)task{
NSLog(@"task");
}
2、模拟下载任务
/*1、下载 L01.zip
*2、下载 L02.zip
*3、通知UI:下载完成
1、2在3之前执行
*/
- (void)demo1 {
// 串行,异步顺序下载
dispatch_queue_t serialQueue =dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 5秒内的随机时间
dispatch_async(serialQueue, ^{
NSLog(@"%@下载 L01.zip",[NSThread currentThread]);
});
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 5秒内的随机时间
dispatch_async(serialQueue, ^{
NSLog(@"%@下载 L02.zip",[NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@下载完成",[NSThread currentThread]);
});
});
});
}
3、并行异步
- (void)demo2 {
// 并行异步 "shift+command+o"快速查找
dispatch_queue_t concurrentQueue =dispatch_queue_create("concurrentQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 5秒内的随机时间
// 并行同步顺序下载
dispatch_sync(concurrentQueue, ^{
NSLog(@"%@下载 L01.zip",[NSThread currentThread]);
});
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 5秒内的随机时间
dispatch_sync(concurrentQueue, ^{
NSLog(@"%@下载 L02.zip",[NSThread currentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@下载完成",[NSThread currentThread]);
});
});
}
4、任务1、2在子线程上先顺序执行后,任务3、4在主线程上执行,最后任务5、6、7在子线程上并发无序执行
- (void)demo3 {
dispatch_queue_t serialQueue =dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrentQueue =dispatch_queue_create("concurrentQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
dispatch_sync(serialQueue, ^{
NSLog(@"%@执行任务1",[NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"%@执行任务2",[NSThread currentThread]);
});
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@执行任务3",[NSThread currentThread]);
});
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@执行任务4",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
dispatch_async(concurrentQueue, ^{
NSLog(@"%@执行任务5",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"%@执行任务6",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"%@执行任务7",[NSThread currentThread]);
});
});
});
}
5、队列组
- (void)demo4 {
NSLog(@"begin");
// 创建队列组
dispatch_group_t group =dispatch_group_create();
// 开启异步任务
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
// 模拟网络卡
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 休眠5秒内随机时间
NSLog(@"%@下载 L01.zip",[NSThread currentThread]);
});
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
// 模拟网络卡
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 休眠5秒内随机时间
NSLog(@"%@下载 L02.zip",[NSThread currentThread]);
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{
NSLog(@"%@下载完成",[NSThread currentThread]);
});
}
6、GCD组函数的另外使用方式
- (void)demo5 {
/* dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
dispatch_retain(group);
dispatch_group_enter(group);
dispatch_async(queue, ^{
block();
dispatch_group_leave(group);
dispatch_release(group);
}); */
dispatch_group_t group =dispatch_group_create();
dispatch_group_enter(group);
// 模拟异步网络请求
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
//模拟网络卡
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 休眠5秒内随机时间
NSLog(@"%@下载 L01.zip",[NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_enter(group);
// 模拟异步网络请求
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
// 模拟网络卡
[NSThread sleepForTimeInterval:arc4random_uniform(5)]; // 休眠5秒内随机时间
NSLog(@"%@下载 L02.zip",[NSThread currentThread]);
dispatch_group_leave(group);
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{
NSLog(@"%@下载完成",[NSThread currentThread]);
});
}
网友评论