GCD的線程方式是以C語言爲基礎的多線程技術,整體上分爲串行隊列和並行隊列兩種實現方式。html
GCD串行隊列:服務器
#param mark -TWThread.gcd.seral是新建立的隊列的名字,主要做用體如今斷點調試階段,能夠根據名字判斷線程的隊列
//DISPATCH_QUEUE_SERIAL,標誌着這個隊列是串行隊列,DISPATCH_QUEUE_CONCURRENT,表示爲並行隊列
-(void)gcdSeral
{
//建立一個串行隊列
dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.seral", DISPATCH_QUEUE_SERIAL);
//同步任務順序執行(串行隊列中的同步任務,也只能是順序執行的,沒有意義)
// dispatch_sync(q, ^{
// NSLog(@"%@",[NSThread currentThread]);
// });
//串行隊列中的異步任務會新建一個線程(串行隊列中的異步任務是在IOS開發中最經常使用的方式)
for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@",[NSThread currentThread]);//打印當前線程
});
}
}
GCD並行隊列:網絡
#pragma mark -並行隊列 -(void)gcdConcurrent { //特色:沒有隊形,執行順序程序猿不能控制 //建立一個並行隊列 dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.concurrent", DISPATCH_QUEUE_CONCURRENT); //並行隊列中執行同步任務也只能在主線程中進行 //並行隊列中執行異步任務會建立多個線程(在多線程中不容易進行優先級的控制,主要緣由是使用C語言來實現優先級的處理比較複雜) for (int i = 0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@",[NSThread currentThread]); }); } }
GCD全局隊列:多線程
#pragma mark - 全局隊列,蘋果爲了方便開發者進行多線程開發而保留的全局的隊列 -(void)gcdGlobalQueue { //全局隊列無需建立直接get dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //同步任務順序執行 // dispatch_sync(q, ^{ // NSLog(@"%@",[NSThread currentThread]); // }); //異步任務會建立多個線程 for (int i = 0; i < 10; i++) { dispatch_async(q, ^{ NSLog(@"%@",[NSThread currentThread]); }); } }
GCD總結異步
1>disptach_sync 沒有建立線程的慾望,就在當前線程執行async
最主要的目的,阻塞並行隊列任務的執行,只有當前的同步任務執行完畢後,後續的任務纔可以執行spa
應用場景:用戶登陸!線程
2>dispatch_async 有建立線程的慾望,可是建立多少條線程,取決與隊列的類型調試
GCD的隊列htm
1>串行隊列 相似於跑步,只有一條跑道,最多可以有兩條
若是存在異步任務,就會在新線程中執行異步任務,而同步任務依舊在當前線程中執行
2>並行隊列 相似與賽跑,具體跑道的數量,由系統決定
一個實際問題的解決
用戶登陸操做,登陸的過程當中能夠選擇取消登陸操做,可是在登陸完成以前不能進行其餘的操做。
解決方式是,進行任務嵌套
- (void)demo { dispatch_queue_t q = dispatch_queue_create("demo", DISPATCH_QUEUE_CONCURRENT); // 在新線程中工做,將這個登陸的過程放在一個異步隊列中 dispatch_async(q, ^{ // 2 NSLog(@"%@", [NSThread currentThread]); __block BOOL userLogon = NO; // 用戶登陸,用戶輸入用戶名,密碼以後,提交到服務器確認身份 // 用來阻塞必需要按照順序執行的任務,將登陸的過程放在同步任務中。 dispatch_sync(q, ^{ // 2 NSLog(@"用戶網絡登錄 %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:3.0f]; userLogon = NO; }); // 身份確認以前,不能作其餘事情 dispatch_async(q, ^{ // 多是3,也多是2 // 3.0(對的) / 立馬執行(不對的) NSLog(@"後續處理 %@", [NSThread currentThread]); if (userLogon) { NSLog(@"welcome"); } else { NSLog(@"why"); } }); // 隊列是先進先出FIFO的,隊列中的任務都是串着的 }); }