1.GCD
GCD(Grand Central Dispatch) ---- '牛逼的中枢调度器'!
// C语言框架 / 自动管理线程的生命周期(创建/释放)
推出GCD的目的:取代NSThread!
为"多核"的"并行"运算提出的解决方案!
优点:
<1> GCD 能够自动利用更多的CPU的核数(双核/四核)!
<2> GCD 会自动管理线程的生命周期.
1.2 GCD中的两个核心概念:
"任务":
想要做的事情/执行什么操作.
GCD 中的任务定义在block中.
void (^myBlock)() = ^{
// 想要做的事情/任务
}
"队列":
用来'存放'任务!
2.队列
串行、并行 是队列的类型。
队列 != 线程!
队列中存放的任务最后都要由线程来执行!
队列的原则:先进先出,后进后出(FIFO/ First In First Out)!
2.1 队列的类型:
<1> '串行'队列:(Serial Dispatch Queue)
存放按顺序执行的任务!(一个任务执行完毕,再执行下一个任务)!
// 创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
<2> '并发'队列:(Concurrent Dispatch Queue)
存放想要同时(并发)执行的任务!
// 创建一个并发队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
注意两个非常常用的特殊队列:
<1> 主队列: // UI 操作放在主队列中执行!
跟主线程相关联的队列!
主队列是 GCD 自带的一种特殊的串行队列!
主队列中的任务都会在主线程中执行!
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
<2> 全局并发队列: // 一般情况下,并发任务都可以放在全局并发队列中!
//获取全局并发队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
串行,并行是队列的特征。同步,异步是线程的执行节奏
3. GCD使用
GCD中有两个用来执行任务的函数:
'同步'执行任务:
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
'异步'执行任务:
dispatch_async(dispatch_queue_t queue, <#^(void)block#>)
// <#dispatch_queue_t queue#> :队列
// <#^(void)block#>:任务
"同步"和"异步"的区别:
"同步": 只能在'当前'线程中执行任务,不具备开启新线程的能力.
"异步": 可以在'新'的线程中执行任务,具备开启新线程的能力.
GCD 使用有两个步骤:
<1> 将任务添加到队列中;
<2> 选择同步还是异步的方式执行任务.
异步队列才有开启新线程的能力。
1> dispatch_async + 全局并发队列 (可以开启多条线程)
2> dispatch_async + 自己创建的串行队列 (开启一条线程)
同步+串行:顺序执行 (同步不开新线程)
同步+并发:顺序执行 (同步不开新线程)
异步+并发:开启多条线程,同时执行
异步+串行:开启一条子线程,顺序执行
阻塞式函数 全局并发没效果.只能是自定义的并发队列
dispath_barrier_async{}