Grand Central Dispatch,也就是“最牛逼的中樞調(diào)度器”
容易混淆的術(shù)語
# 有4個(gè)術(shù)語比較容易混淆:同步、異步、并發(fā)、串行 #
同步和異步主要影響:能不能開啟新的線程
同步:只是在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
并發(fā)和串行主要影響:任務(wù)的執(zhí)行方式
并發(fā):允許多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(并不是用來并發(fā)就能開線程,得要使用了異步線程)
串行:一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)
-
GCD中有2個(gè)核心,搞來搞去永遠(yuǎn)都是這兩個(gè)
任務(wù):執(zhí)行什么操作 隊(duì)列:用來存放任務(wù)
-
將任務(wù)添加到隊(duì)列中
GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放到對應(yīng)的線程中執(zhí)行 任務(wù)的取出遵循隊(duì)列的FIFO原則:先進(jìn)先出,后進(jìn)后出 它會(huì)自動(dòng)做操作,first in first out
- GCD的隊(duì)列可以分為2大類型
-
并發(fā)隊(duì)列(Concurrent Dispatch Queue)
- 可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
- 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效。他們要合作才可以
串行隊(duì)列(Serial Dispatch Queue)
讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))
-
- GCD的隊(duì)列可以分為2大類型
- GCD中還有個(gè)用來執(zhí)行任務(wù)的函數(shù):
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
- 在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
- 這個(gè)queue不能是全局的并發(fā)隊(duì)列
- 延時(shí)執(zhí)行
iOS常見的延時(shí)執(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í)行這里的代碼... // 默認(rèn)在主線程執(zhí)行,你也可以并發(fā),在子線程執(zhí)行});
使用NSTimer
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];
- 快速迭代
使用dispatch_apply函數(shù)能進(jìn)行快速迭代遍歷
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index){
// 執(zhí)行10次代碼,index順序不確定
// 和for循環(huán)不同,不是有序的
// 它是同時(shí)并發(fā)遍歷,一起做事情,快速遍歷迭代
// 比如剪切圖片的例子
});