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