GCD

GCD 是蘋果APP開發(fā)(Objective-c)中管理線程的一種方式!

涉及到線程 就有兩個很重要的概念   任務  和   隊列

任務: 任務就是需要執(zhí)行的一項操作 在執(zhí)行操作的時候又 可以分為 同步和異步執(zhí)行方式料扰!

      ---  同步執(zhí)行:  不開辟新的線程旨巷,就占用當前的線程 來執(zhí)行這項任務 (不具備開辟新線程的能力)!
      
      ---  異步執(zhí)行:  在和當前線程 不同的另一個線程中執(zhí)行任務 (具有開辟新線程的能力)!

隊列 : 這里的隊列是指任務隊列,遵守FIFO ( first in first out)特性放仗! 隊列有兩種類型 串行隊列 和 并行隊列

      ---  串行隊列 :  單通道(好比只有一條水管流水)享言,一個接一個的執(zhí)行隊列中任務桑嘶!
                
                執(zhí)行特點:在 全部并發(fā)隊列蒋搜、手工創(chuàng)建串行隊列、主隊列 中都沒有開啟新線程褐着,串行特性執(zhí)行任務!

      ---   并行隊列 :多通道 (好比坷澡,有多個水管同時流水),多個任務可以同時執(zhí)行(多個水管中的水可以同時流出)含蓉!
        
                執(zhí)行特點: 在全局并發(fā)隊列 中有開啟了新的線程并行執(zhí)行任務
                                 在自己創(chuàng)建的隊列中 有開啟新線程   串行特性執(zhí)行任務
                                 在主隊列中  沒有開啟新線程   串行特性執(zhí)行任務

GCD 使用步驟 :

  1.明確定制任務频敛,根據(jù)任務的特點 (同步還是異步) 選擇    合適的隊列類型(串行還是并行)!

  2. 將任務加入到多列之中馅扣!

  3.系統(tǒng)根據(jù)任務類型 或者開新線程 或者不開新線程  斟赚、根據(jù) 隊列類型 來取出一個任務或者多個任務開始執(zhí)行!

同步函數(shù)和異步函數(shù)

    dispatch_sync(queue, ^{
        NSLog(@"同步函數(shù)");
    });

    dispatch_async(queue, ^{
        NSLog(@"異步函數(shù)");
    });

獲取幾種隊列 :

    //主隊列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    // 串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    
    // 并行隊列
    dispatch_queue_t queue1 = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);

    //全部并發(fā)隊列
    dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

幾種任務和隊列的配合方式:

//1.同步函數(shù) + 串行隊列
    // 串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"同步函數(shù) + 串行隊列");
    });
//2.異步函數(shù) + 串行隊列
    // 串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"異步函數(shù) + 串行隊列");
    });
//3.同步函數(shù) + 并行隊列
    // 串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"同步函數(shù) + 并行隊列");
    });
//4.異步函數(shù) + 并行隊列
    // 串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"異步函數(shù) + 并行隊列");
    });
 //主隊列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^{
        NSLog(@"主隊列 + 異步函數(shù)");
    });
    dispatch_sync(mainQueue, ^{
        NSLog(@"主隊列 + 同步函數(shù)");
    });
//全局并發(fā)隊列 + 同步函數(shù) 實現(xiàn)線程依賴一次執(zhí)行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"for -- 1 -- %d",i);
        });
    }
    
    for (int i = 0; i < 5; i++) {
        dispatch_sync(queue, ^{
            NSLog(@"for -- 2 -- %d",i);
        });
    }

結(jié)果:
for -- 1 -- 0
for -- 1 -- 1
for -- 1 -- 2
for -- 1 -- 3
for -- 1 -- 4
for -- 2 -- 0
for -- 2 -- 1
for -- 2 -- 2
for -- 2 -- 3
for -- 2 -- 4

//全局并發(fā)隊列 + 異步函數(shù) 開啟新線程并發(fā)執(zhí)行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"for -- 1 -- %d",i);
        });
    }
    
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{
            NSLog(@"for -- 2 -- %d",i);
        });
    }

結(jié)果:

** for -- 1 -- 1**
** for -- 1 -- 0**
** for -- 1 -- 2**
** for -- 1 -- 3**
** for -- 1 -- 4**
** for -- 2 -- 0**
** for -- 2 -- 1**
** for -- 2 -- 2**
** for -- 2 -- 3**

回主線程 (用于更新UI)

    dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@",[NSThread currentThread]); });

延時執(zhí)行

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"1.5s后執(zhí)行內(nèi)容");
    });

單利模式用到的一次性

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ 
      // 只執(zhí)行1次的代碼(這里面默認是線程安全的
      )});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市差油,隨后出現(xiàn)的幾起案子拗军,更是在濱河造成了極大的恐慌任洞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件发侵,死亡現(xiàn)場離奇詭異交掏,居然都是意外死亡,警方通過查閱死者的電腦和手機刃鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門盅弛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铲汪,你說我怎么就攤上這事熊尉。” “怎么了掌腰?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長张吉。 經(jīng)常有香客問我齿梁,道長,這世上最難降的妖魔是什么肮蛹? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任勺择,我火速辦了婚禮,結(jié)果婚禮上伦忠,老公的妹妹穿的比我還像新娘省核。我一直安慰自己,他們只是感情好昆码,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布气忠。 她就那樣靜靜地躺著,像睡著了一般赋咽。 火紅的嫁衣襯著肌膚如雪旧噪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天脓匿,我揣著相機與錄音淘钟,去河邊找鬼。 笑死陪毡,一個胖子當著我的面吹牛米母,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毡琉,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼铁瞒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绊起?” 一聲冷哼從身側(cè)響起精拟,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜂绎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栅表,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年师枣,在試婚紗的時候發(fā)現(xiàn)自己被綠了怪瓶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡践美,死狀恐怖洗贰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陨倡,我是刑警寧澤敛滋,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站兴革,受9級特大地震影響绎晃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杂曲,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一庶艾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧擎勘,春花似錦咱揍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟹地,卻和暖如春积暖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怪与。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工夺刑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人分别。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓遍愿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耘斩。 傳聞我的和親對象是個殘疾皇子沼填,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容