记录我工作中使用到的GCD方法,定期更新完善。
Grand Central Dispatch (GCD) 是Apple开发的一个多核编程的较新的解决方法。
- GCD可用于多核的并行运算
- GCD会自动利用更多的CPU内核(比如双核、四核)
- GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。但是看了很多文章,感觉GCD太大了,根本就记不住,所以写下这个笔记,记录下自己使用到的方法。
- 同时执行多个异步操作,都执行完毕,再执行某个方法。
// 创建信号量
_semaphore = dispatch_semaphore_create(0);
// 创建全局并行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
// 请求一
//获取轮播图数据
[self getCarouselData];
});
dispatch_group_async(group, queue, ^{
// 请求二
//获取首页 3 和 8 张图
[self getTemplateImg];
});
dispatch_group_notify(group, queue, ^{
// 2个请求对应2次信号等待
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
//回到主线程刷新ui
dispatch_async(dispatch_get_main_queue(), ^{
DLog(@"------------ 请求完毕 ---------------");
[self.tableView reloadData];
[self.tableView.mj_header endRefreshing];
});
});
在请求方法获取到数据时
//[self getCarouselData];
DLog(@"------------ 第一次 请求完毕 ---------------");
dispatch_semaphore_signal(_semaphore);
- GCD进行延迟操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.navigationController popViewControllerAnimated:YES];
});
- GCD倒计时
__block int timeout= 59; //倒计时时间
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){ //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
[self.getCode setTitle:@"获取验证码" forState:UIControlStateNormal];
self.getCode.userInteractionEnabled = YES;
});
}else{
// int minutes = timeout / 60;
int seconds = timeout % 120;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
[self.getCode setTitle:[NSString stringWithFormat:@"%@秒后重获",strTime] forState:UIControlStateNormal];
self.getCode.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
4.异步操作,主线程刷新UI
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//通知主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
//回调或者说是通知主线程刷新,
[self.mTableView reloadData];;
});
});
5.调度组
//1.创建调度组
dispatch_group_t group = dispatch_group_create();
//2.队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//3.调度组监听队列
dispatch_group_enter(group);
dispatch_group_async(group, q, ^{
sleep(1);
NSLog(@"download 1");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_group_async(group, q, ^{
NSLog(@"download 2");
dispatch_group_leave(group);
});
dispatch_group_notify(group, q, ^{
NSLog(@"完成");
});