#GCD回顧系列之Queues

GCD回顧系列之Queues

GCD Objects

當(dāng)你使用Objective-C編譯器構(gòu)建你的App,所有的dispatch object是Obejctive-C對(duì)象醇锚。
引用Queue基本對(duì)象為dispatch_queue_t;在MRC下侄旬,使用*dispatch_retaindispatch_release函數(shù)來(lái)retain 和release你的dispatch objects,而不是使用Core Foundatons函數(shù)钻注。如果你想在ARC下篮撑,使用retain/release語(yǔ)義逞壁,需要添加 DOS_OBJECT_USE_OBJC=0編譯標(biāo)記位猎莲,參考位置.

GCD QueueTasks

Queues 分類

GCD在應(yīng)用中管理FIFO queues,以block對(duì)象的形式提交任務(wù)到隊(duì)列中,最終有系統(tǒng)線程池來(lái)執(zhí)行绍弟。GCD提供了是哪種類型的隊(duì)列:

+Main: 在應(yīng)用主隊(duì)列中任務(wù)串行執(zhí)行。

+Concurrent: 以FIFO順序入隊(duì)著洼,但是并發(fā)執(zhí)行樟遣,隊(duì)列任務(wù)完成順序?yàn)闊o(wú)序而叼。

+Serial: 以FIFO順序一次只執(zhí)行一個(gè)。

Note

并發(fā)和并行從宏觀上來(lái)講都是同時(shí)處理多路請(qǐng)求的概念豹悬。但并發(fā)和并行又有區(qū)別葵陵,并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生屿衅。

Queues創(chuàng)建方式

主隊(duì)列

主隊(duì)列被系統(tǒng)自動(dòng)創(chuàng)建埃难,與應(yīng)用程序的主線程關(guān)聯(lián),屬于串行隊(duì)列。應(yīng)用程序使用以下三種形式調(diào)用提交到主隊(duì)列的block:

  • dispatch_main
  • UIApplicationMain(iOS)
  • 在主隊(duì)列中使用 CFRunLoopRef
    獲取主隊(duì)列的方式:dispatch_get_main_queue()
串行隊(duì)列Serial

<pre> dispatch_queue_t serialQueue = dispatch_queue_create("com.allan.queue", DISPATCH_QUEUE_SERIAL); //DISPATCH_QUEUE_SERIAL也可寫(xiě)為NULL
</pre>

并發(fā)隊(duì)列Concurrent

1.全局方式
<pre> dispatch_queue_t gloalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);全局共享并發(fā)隊(duì)列
//第一個(gè)參數(shù):優(yōu)先升級(jí) 第二個(gè)參數(shù):預(yù)留標(biāo)記為涤久,一般設(shè)置為0</pre>
優(yōu)先級(jí)分類為:

define DISPATCH_QUEUE_PRIORITY_HIGH 2

define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

define DISPATCH_QUEUE_PRIORITY_LOW (-2)

define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

iOS8新加了一個(gè)功能叫Quality of Service(QoS)涡尘,里面提供了一下幾個(gè)更容易理解的枚舉名來(lái)使用user interactive,user initiated响迂,utility和background,以下為對(duì)應(yīng)表

<pre>

    • DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
    • DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
    • DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
    • DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
      </pre>
      詳細(xì)描述
      5種隊(duì)列考抄,主隊(duì)列(main queue),四種通用調(diào)度隊(duì)列,自己定制的隊(duì)列蔗彤。四種通用調(diào)度隊(duì)列為

QOS_CLASS_USER_INTERACTIVE:user interactive等級(jí)表示任務(wù)需要被立即執(zhí)行提供好的體驗(yàn)川梅,用來(lái)更新UI,響應(yīng)事件等然遏。這個(gè)等級(jí)最好保持小規(guī)模贫途。
QOS_CLASS_USER_INITIATED:user initiated等級(jí)表示任務(wù)由UI發(fā)起異步執(zhí)行。適用場(chǎng)景是需要及時(shí)結(jié)果同時(shí)又可以繼續(xù)交互的時(shí)候待侵。
QOS_CLASS_UTILITY:utility等級(jí)表示需要長(zhǎng)時(shí)間運(yùn)行的任務(wù)丢早,伴有用戶可見(jiàn)進(jìn)度指示器。經(jīng)常會(huì)用來(lái)做計(jì)算秧倾,I/O怨酝,網(wǎng)絡(luò),持續(xù)的數(shù)據(jù)填充等任務(wù)那先。這個(gè)任務(wù)節(jié)能
QOS_CLASS_BACKGROUND:background等級(jí)表示用戶不會(huì)察覺(jué)的任務(wù)农猬,使用它來(lái)處理預(yù)加載,或者不需要用戶交互和對(duì)時(shí)間不敏感的任務(wù).

參考:Building Responsive and Efficient Apps with GCD

2.自定義方式
<pre>dispatch_queue_t concurrentQueue = dispatch_queue_create("com.allan.concurrent", DISPATCH_QUEUE_CONCURRENT);
</pre>

小插曲

1.獲取自定義隊(duì)列的名字
<pre>dispatch_queue_get_label(concurrentQueue)</pre>

Queues執(zhí)行方式

1.同步執(zhí)行

dispatch_sync(yourQueue, ^{});

應(yīng)用
同步鎖售淡,隊(duì)列類型為自定義串行隊(duì)列斤葱。

2.異步執(zhí)行

dispatch_async(yourQueue, ^{});

3.延遲執(zhí)行
<pre>
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 33ull * NSEC_PER_SEC);
dispatch_after(time, concurrentQueue, ^{

});</pre>
4.快速迭代執(zhí)行
<pre>
dispatch_apply(5, concurrentQueue, ^(size_t location) {
NSLog(@"執(zhí)行-%d",location);
});
//第一個(gè)參數(shù):執(zhí)行次數(shù), 第二個(gè)參數(shù):隊(duì)列類型
</pre>

調(diào)節(jié)Queues優(yōu)先級(jí)

1.dipatch_queue_attr_make_with_qos_class
<pre>
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, 100);
dispatch_queue_t queue = dispatch_queue_create("com.allan.qosqueue", attr);
</pre>
2.dispatch_set_target_queue

dispatch_set_target_queue(queue1, targetQueue);這樣設(shè)置時(shí)揖闸,相當(dāng)于將queue1指派給targetQueue苦掘,如果targetQueue是串行隊(duì)列,則queue1是串行執(zhí)行的楔壤;如果targetQueue是并行隊(duì)列,那么queue1是并行的惯驼。
2.1設(shè)置優(yōu)先級(jí)
<pre>
dispatch_queue_t queue = dispatch_queue_create("com.allan.settargetqueue",); //需要設(shè)置優(yōu)先級(jí)的queue
dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, ); //參考優(yōu)先級(jí)
dispatch_set_target_queue(queue, referQueue); //設(shè)置queue和referQueue的優(yōu)先級(jí)一樣
</pre>
2.2設(shè)置隊(duì)列層級(jí)體系
將一個(gè)用戶隊(duì)列的目標(biāo)隊(duì)列指定為另一個(gè)用戶隊(duì)列蹲嚣。這樣做可以強(qiáng)制多個(gè)隊(duì)列相互協(xié)調(diào)地串行執(zhí)行递瑰,這樣足以構(gòu)建一組隊(duì)列,通過(guò)掛起和暫停那個(gè)目標(biāo)隊(duì)列隙畜,我們可以掛起和暫停整個(gè)組
<pre>
dispatch_queue_t serialQueue = dispatch_queue_create("com.allan.serialqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t firstQueue = dispatch_queue_create("com.allan.firstqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t secondQueue = dispatch_queue_create("com.allan.secondqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(firstQueue, serialQueue);
dispatch_set_target_queue(secondQueue, serialQueue);
dispatch_async(firstQueue, ^{
NSLog(@"1");
});
dispatch_async(secondQueue, ^{
NSLog(@"2");
});
dispatch_async(secondQueue, ^{
NSLog(@"3");
});
</pre>

Queues掛起

dispatch queue可以被掛起和恢復(fù)抖部。使用 dispatch_suspend函數(shù)來(lái)掛起,使用 dispatch_resume 函數(shù)來(lái)恢復(fù)议惰。這兩個(gè)函數(shù)的行為是如你所愿的慎颗。另外,這兩個(gè)函數(shù)也可以用于dispatch source言询。

一個(gè)要注意的地方是俯萎,dispatch queue的掛起是block粒度的。換句話說(shuō)运杭,掛起一個(gè)queue并不會(huì)將當(dāng)前正在執(zhí)行的block掛起夫啊。它會(huì)允許當(dāng)前執(zhí)行的block執(zhí)行完畢,然后后續(xù)的block不再會(huì)被執(zhí)行辆憔,直至queue被恢復(fù)撇眯。

還有一個(gè)注意點(diǎn):從main上得來(lái)的:如果你掛起了一個(gè)queue或者source,那么銷毀它之前虱咧,必須先對(duì)其進(jìn)行恢復(fù)熊榛。

參考文章

1https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079-CH2-SW66

2.http://www.reibang.com/p/fbe6a654604c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腕巡,隨后出現(xiàn)的幾起案子玄坦,更是在濱河造成了極大的恐慌,老刑警劉巖逸雹,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件营搅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梆砸,警方通過(guò)查閱死者的電腦和手機(jī)转质,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帖世,“玉大人休蟹,你說(shuō)我怎么就攤上這事∪战茫” “怎么了赂弓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哪轿。 經(jīng)常有香客問(wèn)我盈魁,道長(zhǎng),這世上最難降的妖魔是什么窃诉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任杨耙,我火速辦了婚禮赤套,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珊膜。我一直安慰自己容握,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布车柠。 她就那樣靜靜地躺著剔氏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竹祷。 梳的紋絲不亂的頭發(fā)上谈跛,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音溶褪,去河邊找鬼币旧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛猿妈,可吹牛的內(nèi)容都是我干的吹菱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼彭则,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鳍刷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俯抖,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤输瓜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芬萍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尤揣,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柬祠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了北戏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漫蛔,死狀恐怖嗜愈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莽龟,我是刑警寧澤蠕嫁,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站毯盈,受9級(jí)特大地震影響剃毒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一迟赃、第九天 我趴在偏房一處隱蔽的房頂上張望陪拘。 院中可真熱鬧,春花似錦纤壁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迄靠,卻和暖如春秒咨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掌挚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工雨席, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吠式。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓陡厘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親特占。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糙置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • GCD (Grand Central Dispatch) :iOS4 開(kāi)始引入,使用更加方便是目,程序員只需要將任務(wù)添...
    池鵬程閱讀 1,332評(píng)論 0 2
  • GCD 深入理解:第一部分 什么是 GCD GCD 是 libdispatch 的市場(chǎng)名稱谤饭,而 libdispat...
    willphonez閱讀 625評(píng)論 0 2
  • GCD筆記 總結(jié)一下多線程部分,最強(qiáng)大的無(wú)疑是GCD,那么先從這一塊部分講起. Dispatch Queue的種類...
    jins_1990閱讀 761評(píng)論 0 1
  • 雖然 GCD 已經(jīng)出現(xiàn)過(guò)一段時(shí)間了,但不是每個(gè)人都明了其主要內(nèi)容懊纳。這是可以理解的揉抵;并發(fā)一直很棘手,而 GCD 是基...
    隨風(fēng)飄蕩的小逗逼閱讀 1,334評(píng)論 0 2
  • “一千個(gè)讀者,就會(huì)有一千個(gè)哈姆雷特”身弊。 第一次看失樂(lè)園辟汰,感覺(jué)每一章節(jié)給我的感覺(jué)各不相同,閱讀時(shí)感覺(jué)自己像是個(gè)矛盾...
    Alise_7f00閱讀 603評(píng)論 0 0