IOS 多线程 GCD的使用
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层"); }); });