GCD線程方式

  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的,隊列中的任務都是串着的
    });
}
相關文章
相關標籤/搜索