Grand Central Dispatch丝里,也就是“最牛逼的中樞調(diào)度器”
容易混淆的術語
# 有4個術語比較容易混淆:同步入客、異步技掏、并發(fā)澄暮、串行 #
同步和異步主要影響:能不能開啟新的線程
同步:只是在當前線程中執(zhí)行任務蝌以,不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務糊啡,具備開啟新線程的能力
并發(fā)和串行主要影響:任務的執(zhí)行方式
并發(fā):允許多個任務并發(fā)(同時)執(zhí)行(并不是用來并發(fā)就能開線程,得要使用了異步線程)
串行:一個任務執(zhí)行完畢后豪娜,再執(zhí)行下一個任務
-
GCD中有2個核心乎折,搞來搞去永遠都是這兩個
任務:執(zhí)行什么操作 隊列:用來存放任務
-
將任務添加到隊列中
GCD會自動將隊列中的任務取出,放到對應的線程中執(zhí)行 任務的取出遵循隊列的FIFO原則:先進先出侵歇,后進后出 它會自動做操作,first in first out
- GCD的隊列可以分為2大類型
-
并發(fā)隊列(Concurrent Dispatch Queue)
- 可以讓多個任務并發(fā)(同時)執(zhí)行(自動開啟多個線程同時執(zhí)行任務)
- 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效吓蘑。他們要合作才可以
串行隊列(Serial Dispatch Queue)
讓任務一個接著一個地執(zhí)行(一個任務執(zhí)行完畢后惕虑,再執(zhí)行下一個任務)
-
- GCD的隊列可以分為2大類型
- GCD中還有個用來執(zhí)行任務的函數(shù):
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
- 在前面的任務執(zhí)行結束后它才執(zhí)行,而且它后面的任務等它執(zhí)行完成之后才會執(zhí)行
- 這個queue不能是全局的并發(fā)隊列
- 延時執(zhí)行
iOS常見的延時執(zhí)行調(diào)用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];// 2秒后再調(diào)用self的run方法
使用GCD函數(shù)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 2秒后執(zhí)行這里的代碼... // 默認在主線程執(zhí)行磨镶,你也可以并發(fā)溃蔫,在子線程執(zhí)行});
使用NSTimer
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];
- 快速迭代
使用dispatch_apply函數(shù)能進行快速迭代遍歷
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index){
// 執(zhí)行10次代碼,index順序不確定
// 和for循環(huán)不同琳猫,不是有序的
// 它是同時并發(fā)遍歷伟叛,一起做事情,快速遍歷迭代
// 比如剪切圖片的例子
});