簡(jiǎn)述
- 同步函數(shù)和異步函數(shù)
- 同步函數(shù)
//傳入的為隊(duì)列和任務(wù) dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
- 異步函數(shù)
//傳入的為隊(duì)列和任務(wù) dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
- 同步函數(shù)
- 兩個(gè)核心概念
隊(duì)列
和任務(wù)
-
隊(duì)列
- 串行隊(duì)列
//兩者可隨意選擇 dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL); dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);
- 并發(fā)隊(duì)列
dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);
-
任務(wù)
block 來定義的,預(yù)先準(zhǔn)備好的代碼,在需要的時(shí)候執(zhí)行
void (^task)() = ^ { NSLog(@"%@", [NSThread currentThread]); }
-
重點(diǎn)
-
同步函數(shù)+串行隊(duì)列
- 代碼
/** 不會(huì)開線程,串行執(zhí)行 */ -(void)gcdDemo1 { // 1. 隊(duì)列 /** 參數(shù) 1. 隊(duì)列的名稱 2. 隊(duì)列的屬性 DISPATCH_QUEUE_SERIAL(NULL) 表示串行 */ //dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL); dispatch_queue_t q = dispatch_queue_create("LitterL", NULL); // 2. 執(zhí)行任務(wù) for (int i = 0; i<10; i++) { dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
-
結(jié)果
-
同步函數(shù)+并發(fā)隊(duì)列
- 代碼
//并發(fā)隊(duì)列,同步執(zhí)行 /** 隊(duì)列:并發(fā)隊(duì)列,可以調(diào)度多個(gè)任務(wù) 同步:不能開線程 */ -(void)gcdDemo2 { // 1. 隊(duì)列 dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT); // 2. 異步執(zhí)行 for (int i = 0; i<10; i++) { dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
-
結(jié)果
-
同步函數(shù)+主隊(duì)列
- 代碼
// 主隊(duì)列,同步執(zhí)行 /** 主隊(duì)列:不開線程 同步任務(wù):不開線程 */ -(void)gcdDemo6 { // 1. 主隊(duì)列 dispatch_queue_t q = dispatch_get_main_queue(); // 2. 安排一個(gè)任務(wù) for (int i = 0; i<10; i++) { dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
- 結(jié)果
可以看到輸出出來的結(jié)果是沒有的
//主隊(duì)列的特點(diǎn),如果發(fā)現(xiàn)當(dāng)前主線程有任務(wù)在執(zhí)行,那么主隊(duì)列會(huì)暫停調(diào)度隊(duì)列里面的任務(wù),所以的話它是不會(huì)執(zhí)行隊(duì)列里面的內(nèi)容
-
異步函數(shù)+串行隊(duì)列
- 代碼
// 串行隊(duì)列,異步執(zhí)行 /** 串行隊(duì)列,一個(gè)一個(gè)調(diào)度任務(wù) 執(zhí)行的方法:異步,會(huì)開線程 */ -(void)gcdDemo3 { dispatch_queue_t q = dispatch_queue_create("LitterL", NULL); for (int i = 0; i<10; i++) { //異步函數(shù) dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
-
結(jié)果
-
異步函數(shù)+并發(fā)隊(duì)列
- 代碼
//并發(fā)隊(duì)列,異步執(zhí)行 /** 隊(duì)列:并發(fā)隊(duì)列,可以調(diào)度多個(gè)任務(wù) 異步:可以開啟線程 */ -(void)gcdDemo4 { // 1. 隊(duì)列 dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT); // 2. 異步執(zhí)行 for (int i = 0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
-
結(jié)果
-
異步函數(shù)+主隊(duì)列
- 代碼
// 主隊(duì)列,異步執(zhí)行 /** 隊(duì)列:主隊(duì)列,不可能在其他線程執(zhí)行 任務(wù):異步,開線程,不會(huì)阻塞線程執(zhí)行,不用等待著一條語句執(zhí)行完,就能執(zhí)行下一句 */ -(void)gcdDemo5 { // 1. 主隊(duì)列 - 程序啟動(dòng)之后已經(jīng)存在主線程,主隊(duì)列同樣存在 dispatch_queue_t q = dispatch_get_main_queue(); // 2. 安排一個(gè)任務(wù) for (int i = 0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); } }
-
結(jié)果
補(bǔ)充
異步函數(shù)+并發(fā)隊(duì)列:開啟多條線程,并發(fā)執(zhí)行任務(wù)
異步函數(shù)+串行隊(duì)列:開啟一條線程,串行執(zhí)行任務(wù)
同步函數(shù)+并發(fā)隊(duì)列:不開線程,串行執(zhí)行任務(wù)
同步函數(shù)+串行隊(duì)列:不開線程,串行執(zhí)行任務(wù)
異步函數(shù)+主隊(duì)列:不開線程,在主線程中串行執(zhí)行任務(wù)
同步函數(shù)+主隊(duì)列:不開線程,串行執(zhí)行任務(wù)(注意死鎖發(fā)生)
結(jié)束
本章到此結(jié)束
歡迎各位碼友隨意轉(zhuǎn)載并指正