iOS GCD使用dispatch_set_target_queue

dispatch_set_target_queue

我們發(fā)現(xiàn)獲取全局隊列時破衔,可以設(shè)置隊列的優(yōu)先級冠王,但是我們自己創(chuàng)建的隊列缺沒有設(shè)置優(yōu)先級,如果我們想要設(shè)置隊列的優(yōu)先級就需要通過dispatch_set_target_queue方法了。

dispatch_set_target_queue方法傳入的兩個參數(shù)都是隊列搅荞,第一個是需要修改優(yōu)先級的隊列,它的優(yōu)先級將會變成與第二個隊列一致框咙。

dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
dispatch_set_target_queue(concurrentQueue, global_queue);

我們自己創(chuàng)建的隊列的優(yōu)先級將會變成和我們獲取的全局隊列的優(yōu)先級一致咕痛,都是DISPATCH_QUEUE_PRIORITY_HIGH

上面我們講的是都是并發(fā)隊列的喇嘱,如果第二個參數(shù)傳入的是串行隊列茉贡?

先來看看將3個串行隊列設(shè)置目標(biāo)隊列為同一個串行隊列,我們知道多個串行隊列者铜,如果不是在同一個線程上進(jìn)行同步執(zhí)行腔丧,那么他們之間的情況是并發(fā)的

    dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t serialQueue2 = dispatch_queue_create("serialQueue2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t serialQueue3 = dispatch_queue_create("serialQueue3", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(serialQueue1, ^{
        NSLog(@"任務(wù)1開始");
        sleep(3);
        NSLog(@"任務(wù)1完成");
        
    });
    
    dispatch_async(serialQueue2, ^{
        NSLog(@"任務(wù)2開始");
        sleep(2);
        NSLog(@"任務(wù)2完成");
        
    });
    
    dispatch_async(serialQueue3, ^{
        NSLog(@"任務(wù)3開始");
        sleep(1);
        NSLog(@"任務(wù)3完成");
        
    });

打印結(jié)果如下

15:06:30.725 任務(wù)2開始
15:06:30.725 任務(wù)3開始
15:06:30.725 任務(wù)1開始
15:06:31.729 任務(wù)3完成
15:06:32.729 任務(wù)2完成
15:06:33.727 任務(wù)1完成

從打印記過可以看出3個任務(wù)同時進(jìn)行,但是如果我們將這3個串行隊列的目標(biāo)隊列都設(shè)置為同一個串行隊列呢作烟?

    dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t serialQueue2 = dispatch_queue_create("serialQueue2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t serialQueue3 = dispatch_queue_create("serialQueue3", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    

    dispatch_set_target_queue(serialQueue1, serialQueue);
    dispatch_set_target_queue(serialQueue2, serialQueue);
    dispatch_set_target_queue(serialQueue3, serialQueue);
    
    dispatch_async(serialQueue1, ^{
        NSLog(@"任務(wù)1開始");
        sleep(3);
        NSLog(@"任務(wù)1完成");
        
    });
    
    dispatch_async(serialQueue2, ^{
        NSLog(@"任務(wù)2開始");
        sleep(2);
        NSLog(@"任務(wù)2完成");
        
    });
    
    dispatch_async(serialQueue3, ^{
        NSLog(@"任務(wù)3開始");
        sleep(1);
        NSLog(@"任務(wù)3完成");
        
    });

打印結(jié)果如下

15:06:40.729 任務(wù)1開始
15:06:43.733 任務(wù)1完成
15:06:43.733 任務(wù)2開始
15:06:45.734 任務(wù)2完成
15:06:45.734 任務(wù)3開始
15:06:46.734 任務(wù)3完成

從打印結(jié)果可以看出愉粤,3個任務(wù)是按順序執(zhí)行的,完成一個下一個才開始拿撩,dispatch_set_target_queue在串行隊列直接的使用效果就是使得被添加到同一串行隊列上的隊列上的任務(wù)按順序執(zhí)行衣厘,而不是同時進(jìn)行。

我們在嘗試下將3個并發(fā)隊列的目標(biāo)隊列設(shè)置為一個串行隊列

    dispatch_queue_t concurrentQueue1 = dispatch_queue_create("concurrentQueue1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t concurrentQueue2 = dispatch_queue_create("concurrentQueue2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t concurrentQueue3 = dispatch_queue_create("concurrentQueue3", DISPATCH_QUEUE_CONCURRENT);
    
    
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    

    dispatch_set_target_queue(concurrentQueue1, serialQueue);
    dispatch_set_target_queue(concurrentQueue2, serialQueue);
    dispatch_set_target_queue(concurrentQueue3, serialQueue);
    
    dispatch_async(concurrentQueue1, ^{
        NSLog(@"任務(wù)1開始");
        sleep(3);
        NSLog(@"任務(wù)1完成");
        
    });
    
    dispatch_async(concurrentQueue2, ^{
        NSLog(@"任務(wù)2開始");
        sleep(2);
        NSLog(@"任務(wù)2完成");
        
    });
    
    dispatch_async(concurrentQueue3, ^{
        NSLog(@"任務(wù)3開始");
        sleep(1);
        NSLog(@"任務(wù)3完成");
        
    });

打印結(jié)果如下

15:20:25.005 任務(wù)1開始
15:20:28.011 任務(wù)1完成
15:20:28.011 任務(wù)2開始
15:20:30.016 任務(wù)2完成
15:20:30.017 任務(wù)3開始
15:20:31.018 任務(wù)3完成

從結(jié)果可以看出压恒,也是順序執(zhí)行的影暴,也就是說將多個隊列的目標(biāo)隊列設(shè)置為同一個串行隊列怖亭,多個隊列上的任務(wù)將會按添加任務(wù)的順序進(jìn)行處理。

ps:這個方法如果是給將主線程坤检、全局隊列作為第一個參數(shù)的結(jié)果未知兴猩,對串行隊列進(jìn)行循環(huán)設(shè)置對方為目標(biāo)隊列的結(jié)果暫時未知

總結(jié)

dispatch_set_target_queue方法的兩個作用:
1.通過全局隊列來給我們自己創(chuàng)建的隊列設(shè)置隊列的優(yōu)先級。
2.可以為多個隊列設(shè)置同一個串行隊列為目標(biāo)隊列早歇,實現(xiàn)多個隊列直接的任務(wù)按順序執(zhí)行倾芝。

ps:一直沒有想明白第二種情況的使用場景,有想法的朋友麻煩留言交流下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箭跳,一起剝皮案震驚了整個濱河市晨另,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谱姓,老刑警劉巖借尿,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屉来,居然都是意外死亡路翻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門茄靠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茂契,“玉大人,你說我怎么就攤上這事慨绳〉粢保” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵脐雪,是天一觀的道長厌小。 經(jīng)常有香客問我,道長战秋,這世上最難降的妖魔是什么璧亚? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮获询,結(jié)果婚禮上涨岁,老公的妹妹穿的比我還像新娘。我一直安慰自己吉嚣,他們只是感情好梢薪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尝哆,像睡著了一般秉撇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天琐馆,我揣著相機(jī)與錄音规阀,去河邊找鬼。 笑死瘦麸,一個胖子當(dāng)著我的面吹牛谁撼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滋饲,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼厉碟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屠缭?” 一聲冷哼從身側(cè)響起箍鼓,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呵曹,沒想到半個月后款咖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奄喂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年铐殃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砍聊。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡背稼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玻蝌,到底是詐尸還是另有隱情,我是刑警寧澤词疼,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布俯树,位于F島的核電站,受9級特大地震影響贰盗,放射性物質(zhì)發(fā)生泄漏许饿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一舵盈、第九天 我趴在偏房一處隱蔽的房頂上張望陋率。 院中可真熱鬧,春花似錦秽晚、人聲如沸瓦糟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菩浙。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲蜻,已是汗流浹背陆淀。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先嬉,地道東北人轧苫。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像疫蔓,于是被迫代替她去往敵國和親含懊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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