GCD -- 簡單的總結(jié)!

本文不說什么是GCD,只將其簡單的總結(jié),有利于在項目中的使用凛篙!

1.在GCD中,個人不需要關(guān)心線程的開辟栏渺!

2.任務(wù)有同步任務(wù)(同步執(zhí)行)和異步任務(wù)(異步執(zhí)行)呛梆,他們之間的區(qū)別是是否會創(chuàng)建新的線程

3.如果是同步(sync)操作,它會阻塞當(dāng)前線程并等待Block中的任務(wù)執(zhí)行完畢磕诊,然后當(dāng)前線程才會繼續(xù)往下運(yùn)行填物。
如果是異步(async)操作,當(dāng)前線程會直接往下執(zhí)行霎终,它不會阻塞當(dāng)前線程滞磺。

4.隊列:用于存放任務(wù)。一共有兩種隊列莱褒, 串行隊列并行隊列击困。
放到串行隊列的任務(wù),GCD 會FIFO(先進(jìn)先出)地取出來一個广凸,執(zhí)行一個阅茶,然后取下一個,這樣一個一個的執(zhí)行谅海;
放到并行隊列的任務(wù)脸哀,GCD 也會FIFO
的取出來,但不同的是扭吁,它取出來一個就會放到別的線程撞蜂,然后再取出來一個又放到另一個的線程。這樣由于取的動作很快侥袜,忽略不計蝌诡,看起來,所有的任務(wù)都是一起執(zhí)行的系馆。不過需要注意送漠,GCD 會根據(jù)系統(tǒng)資源控制并行的數(shù)量,所以如果任務(wù)很多由蘑,它并不會讓所有任務(wù)同時執(zhí)行闽寡。

5.我們用圖表來總結(jié)上述的關(guān)系

同步任務(wù) 異步任務(wù)
串行隊列 當(dāng)前線程,一個一個執(zhí)行 其他線程尼酿,一個一個執(zhí)行
并行隊列 當(dāng)前線程爷狈,一個一個執(zhí)行 開很多線程,一起執(zhí)行

6.自己可以創(chuàng)建串行隊列, 也可以創(chuàng)建并行隊列裳擎。我們先來看看一個GCD代碼

dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT)

其中第二個參數(shù)是最重要的涎永。第二個參數(shù)用來表示創(chuàng)建的隊列是串行的還是并行的:
傳入DISPATCH_QUEUE_SERIAL
或NULL表示創(chuàng)建串行隊列。
傳入DISPATCH_QUEUE_CONCURRENT
表示創(chuàng)建并行隊列,其中并行隊列有系統(tǒng)定義的四種優(yōu)先級 ,比如DISPATCH_QUEUE_PRIORITY_DEFAULT’

獲取主隊列方法

// 獲取主隊列
dispatch_queue_t mainQueue = dispatch_get_main_queue();

兩者綜合:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{    
  [NSThread sleepForTimeInterval:2];        
  dispatch_async(dispatch_get_main_queue(), ^{    
         //主線程更新UI
   }) ;    
  });

這是一段我們都非常熟悉的代碼羡微,其中包含著

dispatch_async 是異步任務(wù)
dispatch_get_global_queue 全局隊列
dispatch_get_main_queue 主隊列
DISPATCH_QUEUE_PRIORITY_DEFAULT 創(chuàng)建并行隊列


例子1:


dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);   
 NSLog(@“并行隊列上放同步任務(wù)");   
 dispatch_sync(concurrentQueue, ^(){  
      NSLog(@"sync - 同步任務(wù)");   
     [NSThread sleepForTimeInterval:5];   
     NSLog(@“sync5秒后");  
  });  
 NSLog(@“結(jié)束");

輸出 :

GCDTest[] 并行隊列上放同步任務(wù)

GCDTest[] sync - 同步任務(wù)

GCDTest[] ** sync5秒后**//模擬長時間操作

GCDTest[] 結(jié)束

可以見得谷饿,同步任務(wù)要做完Block中的任務(wù),才能繼續(xù)往下執(zhí)行

最常見的使用就是FMDB 中的[queue inDatabase:^(FMDatabase *db)


例子二:


dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
   NSLog(@"并行隊列上放同步任務(wù)");
   dispatch_async(concurrentQueue, ^(){
       NSLog(@"async");
       [NSThread sleepForTimeInterval:5];
       NSLog(@“async5秒后");
   });
NSLog(@“結(jié)束”);

輸出:

GCDTest[] 并行隊列上放同步任務(wù)

GCDTest[] 結(jié)束

GCDTest[] async

GCDTest[]** async5秒后**//模擬長時間操作時間

可以見得妈倔,異步任務(wù)不用做完Block中的任務(wù)博投,已經(jīng)開始繼續(xù)往下執(zhí)行

10 barrier

func dispatch_barrier_async(_ queue: dispatch_queue_t, _ block: dispatch_block_t)

:這個方法重點是你傳入的 queue,當(dāng)你傳入的 queue 是通過DISPATCH_QUEUE_CONCURRENT
參數(shù)自己創(chuàng)建的 queue 時盯蝴,這個方法會阻塞這個 queue注意是阻塞 queue 毅哗,而不是阻塞當(dāng)前線程),一直等到這個 queue 中排在它前面的任務(wù)都執(zhí)行完成后才會開始執(zhí)行自己捧挺,自己執(zhí)行完畢后虑绵,再會取消阻塞,使這個 queue 中排在它后面的任務(wù)繼續(xù)執(zhí)行闽烙。如果你傳入的是其他的 queue, 那么它就和dispatch_async
一樣了翅睛。

func dispatch_barrier_sync(_ queue: dispatch_queue_t, _ block: dispatch_block_t)

:這個方法的使用和上一個一樣,傳入 自定義的并發(fā)隊列(DISPATCH_QUEUE_CONCURRENT)鸣峭,它和上一個方法一樣的阻塞 queue宏所,不同的是 這個方法還會 阻塞當(dāng)前線程
如果你傳入的是其他的 queue, 那么它就和dispatch_sync
一樣了摊溶。

有另外一種介紹:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爬骤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莫换,更是在濱河造成了極大的恐慌霞玄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉岁,死亡現(xiàn)場離奇詭異坷剧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喊暖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門惫企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陵叽,你說我怎么就攤上這事狞尔。” “怎么了巩掺?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵偏序,是天一觀的道長。 經(jīng)常有香客問我胖替,道長研儒,這世上最難降的妖魔是什么豫缨? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮端朵,結(jié)果婚禮上好芭,老公的妹妹穿的比我還像新娘。我一直安慰自己冲呢,他們只是感情好栓撞,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碗硬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢颅。 梳的紋絲不亂的頭發(fā)上恩尾,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音挽懦,去河邊找鬼翰意。 笑死,一個胖子當(dāng)著我的面吹牛信柿,可吹牛的內(nèi)容都是我干的冀偶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼渔嚷,長吁一口氣:“原來是場噩夢啊……” “哼进鸠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起形病,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤客年,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漠吻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體量瓜,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年途乃,在試婚紗的時候發(fā)現(xiàn)自己被綠了绍傲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡耍共,死狀恐怖烫饼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情划提,我是刑警寧澤枫弟,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站鹏往,受9級特大地震影響淡诗,放射性物質(zhì)發(fā)生泄漏骇塘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一韩容、第九天 我趴在偏房一處隱蔽的房頂上張望款违。 院中可真熱鬧,春花似錦群凶、人聲如沸插爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赠尾。三九已至,卻和暖如春毅弧,著一層夾襖步出監(jiān)牢的瞬間气嫁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工够坐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留寸宵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓元咙,卻偏偏與公主長得像梯影,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庶香,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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