GCD 簡(jiǎn)單整理

GCD (Grand Central Dispatch)

概念

關(guān)注兩個(gè)概念:隊(duì)列硅确、任務(wù)。
iOS 多線(xiàn)程方案:pthread缭付、NSThread陷猫、NSOperation、GCD

  1. 隊(duì)列(Queue)和任務(wù)
    GCD提供了dispatch queues來(lái)處理代碼塊足陨,這些隊(duì)列管理所提供給GCD的任務(wù)并用FIFO順序執(zhí)行這些任務(wù)娇未。這樣才能保證第一個(gè)被添加到隊(duì)列里的任務(wù)會(huì)是隊(duì)列中第一個(gè)開(kāi)始的任務(wù),而第二個(gè)被添加的任務(wù)將第二個(gè)開(kāi)始镊讼,如此直到隊(duì)列的終點(diǎn)蝶棋。

調(diào)度隊(duì)列(dispath queue)是一個(gè)對(duì)象,它以 FIFO 的方式管理提交的任務(wù)兼贸。GCD有三種隊(duì)列類(lèi)型:

  1. 串行隊(duì)列吃溅、
  2. 并行隊(duì)列、
  3. 主隊(duì)列

GCD中的任務(wù)只是一個(gè)代碼塊很澄,它可以指一個(gè)block或者函數(shù)指針甩苛。根據(jù)這個(gè)代碼塊添加進(jìn)入隊(duì)列的方式俏站,將任務(wù)分為同步任務(wù)和異步任務(wù):

  1. 同步任務(wù),使用dispatch_sync將任務(wù)加入隊(duì)列墨林;

  2. 異步任務(wù)犯祠,使用dispatch_async將任務(wù)加入隊(duì)列衡载。

  3. 串行(Serial)、并發(fā)(Concurrent)
    串行(Serial)弃榨,指同一時(shí)間每次只能執(zhí)行一個(gè)任務(wù)梨睁。
    并發(fā)(Concurrent),指同一時(shí)間可以同時(shí)執(zhí)行多個(gè)任務(wù)官辈。并發(fā)在異步(dispatch_async)函數(shù)下才有效钧萍。

同步、異步队魏、并行 万搔、串行

  1. 同步和異步?jīng)Q定了要不要開(kāi)啟新的線(xiàn)程
    同步:在當(dāng)前線(xiàn)程中執(zhí)行任務(wù)瞬雹,不具備開(kāi)啟新線(xiàn)程的能力
    異步:在新的線(xiàn)程中執(zhí)行任務(wù),具備開(kāi)啟新線(xiàn)程的能力
  2. 并發(fā)和串行決定了任務(wù)的執(zhí)行方式
    并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
    串行:一個(gè)任務(wù)執(zhí)行完畢后呢诬,再執(zhí)行下一個(gè)任務(wù)

代碼段

  1. dispatch_async
    這種用法非常常見(jiàn)胖缤,比如開(kāi)啟一個(gè)異步的網(wǎng)絡(luò)請(qǐng)求,待數(shù)據(jù)返回后返回主隊(duì)列刷新UI哪廓;又比如請(qǐng)求圖片,待圖片返回刷新UI等
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
    // 一個(gè)異步的任務(wù)分俯,例如網(wǎng)絡(luò)請(qǐng)求缸剪,耗時(shí)的文件操作
    // do something

    dispatch_async(dispatch_get_main_queue(), ^{
        // UI刷新
        // do something
    });
});
  1. dispatch_after
  // 在 1.6 秒后剧劝,將任務(wù)加入隊(duì)列
  NSTimeInterval delayTime = 1.6f;
  dispatch_time_t delayTime_t = dispatch_time(DISPATCH_TIME_NOW,(int64_t)(delayTime * NSEC_PER_SEC));
  dispatch_after(delayTime_t,dispatch_get_main_queue(), ^(void){
      // do something
  });

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(delayTime * NSEC_PER_SEC)),dispatch_get_main_queue(), ^(void){
      // do something
  });

  // 另一種常用實(shí)現(xiàn)
  [self preformSelector:@selector(todoMethod:) withObject:nil afterDelay:5.f];
  1. dispatch_once
// 單例
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
  // do something
});
  1. dispatch_group
    dispatch_group_create 創(chuàng)建一個(gè)調(diào)度組讥此,通過(guò) dispatch_group_async 將任務(wù)分別添加到該組中萄喳,在組中的所有任務(wù)執(zhí)行完成后回調(diào)(dispatch_group_notify)蹋半。
  UIImageView *imageView1 = [[UIImageView alloc]init];
  UIImageView *imageView2 = [[UIImageView alloc]init];

  // 下載多張圖片并且要求圖片都下載完成才更新 UI
  dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  // 異步下載圖片
  dispatch_async(globalQueue, ^{
      dispatch_group_t group = dispatch_group_create();

      __block UIImage *image1 = nil;
      __block UIImage *image2 = nil;

      // 添加任務(wù)到 group
      dispatch_group_async(group, globalQueue, ^{
          NSURL *url = [NSURL URLWithString:@"pic URL"];
          image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
      });

      dispatch_group_async(group, globalQueue, ^{
          NSURL *url = [NSURL URLWithString:@"pic URL"];
          image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
      });

      // group 執(zhí)行完回調(diào),在主線(xiàn)程更新 UI
      dispatch_group_notify(group, dispatch_get_main_queue(), ^{
          imageView1.image = image1;
          imageView2.image = image2;
      });
  });
  1. dispatch_apply
size_t times = 10;
dispatch_apply(times, dispatch_get_global_queue(0, 0), ^(size_t index){
    // 執(zhí)行10次代碼染突,index順序不確定
});
  1. dispatch_barrier_async
    在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行捻爷,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行;不能是全局的并發(fā)隊(duì)列份企;所有的任務(wù)都必須在一個(gè)隊(duì)列中也榄。
  // dispatch_barrier_async的作用是承上啟下,保證此前的任務(wù)都先于自己執(zhí)行司志,此后的任務(wù)也遲于自己執(zhí)行甜紫。
  // 本例中,任務(wù)4會(huì)在任務(wù)1骂远、2囚霸、3都執(zhí)行完之后執(zhí)行,而任務(wù)5激才、6會(huì)等待任務(wù)4執(zhí)行完后執(zhí)行。

  dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
  dispatch_async(queue, ^{
      // 任務(wù)1
      ...
  });
  dispatch_async(queue, ^{
      // 任務(wù)2
      ...
  });
  dispatch_async(queue, ^{
      // 任務(wù)3
      ...
  });
  dispatch_barrier_async(queue, ^{
      // 任務(wù)4
      ...
  });
  dispatch_async(queue, ^{
      // 任務(wù)5
      ...
  });
  dispatch_async(queue, ^{
      // 任務(wù)6
      ...
  });
  1. UI 更新只能在主線(xiàn)程中進(jìn)行
  // 主線(xiàn)程刷新 tableView
  dispatch_async(dispatch_get_main_queue(), ^{
      [self.tableView reload];
    });

  // 常用異步下載圖片
  UIImageView *imageView = [[UIImageView alloc]init];
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSURL *url = [NSURL URLWithString:@"pic URL"];
      UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

      // 回到主線(xiàn)程更新 UI
      dispatch_async(dispatch_get_main_queue(), ^{
          imageView.image = image;
      });
  });

參考:

GCD日記
巧談GCD
iOS筆記-多線(xiàn)程相關(guān)(pthread 瘸恼、NSThread 劣挫、GCD、NSOperation)
由淺入深學(xué)習(xí)GCD??
GCD 深入理解(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钞脂,一起剝皮案震驚了整個(gè)濱河市揣云,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冰啃,老刑警劉巖邓夕,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異阎毅,居然都是意外死亡焚刚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)扇调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矿咕,“玉大人,你說(shuō)我怎么就攤上這事狼钮√贾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵熬芜,是天一觀的道長(zhǎng)莲镣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涎拉,這世上最難降的妖魔是什么瑞侮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任的圆,我火速辦了婚禮,結(jié)果婚禮上半火,老公的妹妹穿的比我還像新娘越妈。我一直安慰自己,他們只是感情好钮糖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布梅掠。 她就那樣靜靜地躺著,像睡著了一般藐鹤。 火紅的嫁衣襯著肌膚如雪瓤檐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天娱节,我揣著相機(jī)與錄音挠蛉,去河邊找鬼。 笑死肄满,一個(gè)胖子當(dāng)著我的面吹牛谴古,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稠歉,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掰担,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了怒炸?” 一聲冷哼從身側(cè)響起带饱,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阅羹,沒(méi)想到半個(gè)月后勺疼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捏鱼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年执庐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片导梆。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轨淌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出看尼,到底是詐尸還是另有隱情递鹉,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布藏斩,位于F島的核電站梳虽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灾茁。R本人自食惡果不足惜窜觉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望北专。 院中可真熱鬧禀挫,春花似錦、人聲如沸拓颓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驶睦。三九已至砰左,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間场航,已是汗流浹背缠导。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溉痢,地道東北人僻造。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像孩饼,于是被迫代替她去往敵國(guó)和親髓削。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 本篇博客共分以下幾個(gè)模塊來(lái)介紹GCD的相關(guān)內(nèi)容: 多線(xiàn)程相關(guān)概念 多線(xiàn)程編程技術(shù)的優(yōu)缺點(diǎn)比較镀娶? GCD中的三種隊(duì)列...
    dullgrass閱讀 37,854評(píng)論 30 236
  • NSThread 第一種:通過(guò)NSThread的對(duì)象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 801評(píng)論 0 3
  • 本篇博客共分以下幾個(gè)模塊來(lái)介紹GCD的相關(guān)內(nèi)容: 多線(xiàn)程相關(guān)概念 多線(xiàn)程編程技術(shù)的優(yōu)缺點(diǎn)比較饱狂? GCD中的三種隊(duì)列...
    有夢(mèng)想的老伯伯閱讀 1,020評(píng)論 0 4
  • iOS中GCD的使用小結(jié) 作者dullgrass 2015.11.20 09:41*字?jǐn)?shù) 4996閱讀 20199...
    DanDanC閱讀 832評(píng)論 0 0
  • D8-3月1日 這一切都交給上帝 接到稅務(wù)局的通知,這個(gè)公司的業(yè)務(wù)要處理了祭刚,那個(gè)公司的納稅性質(zhì)也要變了房资,一時(shí)間頭...
    空鏡_5ee0閱讀 293評(píng)論 0 2