GCD基本概念
优势:自动利用更多的CPU内核,为多核的并行提出解决方案,自动管理线程的生命周期
核心概念:任务、队列
任务:执行什么操作
队列:执行什么任务 类型:并发、串行
将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,任务的取出遵循队列的 FIFO原则:先进先出,后进后出
并发队列 手动创建串行队列 主队列
同步 (sync) 没有开启新线程 没有开启新线程 没有开启新线程
串行执行任务 串行执行任务 串行执行任务
异步 (async) 开启新线程 有新线程开启 没有开启新线程
并发执行任务 串行执行任务 串行执行任务
同步和异步主要影响:能不能开启新的线程
同步:只是在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新线程的能力
并发和串行主要影响:任务的执行方式
并发:允许多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
#pragma mark - 主线程
// 主线程只能开异步,开同步会阻塞线程 产生死锁
dispatch_queue_t mainqueue=dispatch_get_main_queue();
dispatch_async(mainqueue, ^{
NSLog(@"aaaa");
});
#pragma mark - 子线程(后台线程)
dispatch_queue_t global=dispatch_get_global_queue(0, 0);
dispatch_async(global, ^{
NSLog(@"子线程");
});
#pragma mark - 一次性线程
//某段代码在程序运行过程中只被执行1次
static dispatch_once_t oneQueue;
dispatch_once(&oneQueue, ^{
NSLog(@"一次性线程");
});
#pragma mark - 延迟 N 秒 执行线程
double doubleQueue=2.0;
dispatch_time_t popTime=dispatch_time(DISPATCH_TIME_NOW, doubleQueue*NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
NSLog(@"延迟两秒执行");
});
#pragma mark - 自定义线程
dispatch_queue_t user_queue=dispatch_queue_create("blog.lin.com", NULL);
dispatch_async(user_queue, ^{
});
#pragma mark -栅栏
// 栅栏:在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
dispatch_group_t group=dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"线程一");
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"线程二");
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
NSLog(@"汇总结果");
});
//先让后台两个线程并行执行,然后等两个线程都结束后再汇总结果
#pragma mark - 修改代码块之外的变量
__block int i=0;
void (^foo)(void)=^{
i=1;
};
foo();//i修改成1,用__block
//子线程嵌套主线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"子线程处理逻辑");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主线程更新UI层");
});
});