iOS中的函數與隊列

本篇文章中我們主要講解GCD中的函數衣赶。

GCD

GCDGrand Central Dispatch的簡稱伍茄,純c語言淹朋,提供了非常多強大的函數,將任務添加到隊列荠卷,并且指定執(zhí)行任務的函數模庐。

函數

  • 1,GCD中的函數使用block封裝油宜,任務的block沒有參數也沒有返回值掂碱。
  • 2,異步函數dispatch_async: 不用等待當前語句執(zhí)行完畢慎冤,就可以執(zhí)行下一條語句疼燥,會開啟線程執(zhí)行block的任務。
  • 3蚁堤,同步函數dispatch_sync醉者,必須等待當前語句執(zhí)行完畢,才會執(zhí)行下一條語句披诗,不會開啟線程撬即,在當前執(zhí)行block的任務。

函數與隊列

同步函數串行隊列
  • 1呈队,不會開啟線程剥槐,在當前線程執(zhí)行任務。
  • 2宪摧,任務串行執(zhí)行粒竖,任務一個接著一個。
  • 3几于,會產生堵塞蕊苗。
同步函數并發(fā)隊列
  • 1,不會開啟線程沿彭,在當前線程執(zhí)行任務朽砰。
  • 2,任務一個接著一個執(zhí)行。
異步函數串行隊列
  • 1锅移,開啟一條新線程熔掺。
  • 2,任務一個接著一個執(zhí)行非剃。
異步函數并發(fā)對列
  • 1,開啟線程推沸,在當前線程執(zhí)行任務备绽。
  • 2,任務異步執(zhí)行鬓催,沒有順序肺素,與CPU調度有關。

dispatch_sync

dispatch_sync函數宇驾,如果 dispatch_sync()目標queue當前queue倍靡,且 當前queue為串行隊列時,會發(fā)生死鎖(并行queue并不會)课舍。
下面我們通過下面的幾個函數示例來驗證一下:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self mainSyncTest];
}
- (void)mainSyncTest{
    NSLog(@"0");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"1");
    });
    NSLog(@"2");
}
  • 主線程中調用dispatch_sync函數塌西,且 目標queue,為主線程藕坯,住線程是一個串行隊列肺缕,所以會造成死鎖掩蛤。
- (void)test1{
    dispatch_queue_t queue = dispatch_queue_create("LY", NULL);
    NSLog(@"1");
    // 異步函數
    dispatch_async(queue, ^{
        NSLog(@"2");
        // 同步
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
         NSLog(@"4");
    });
    NSLog(@"5");
}

- (void)test2 {
    dispatch_queue_t queue1 = dispatch_queue_create("LY", NULL); // 串行隊列
    dispatch_queue_t queue2 = dispatch_queue_create("Nice", NULL); // 串行隊列
       NSLog(@"1");
       // 異步函數
       dispatch_async(queue1, ^{
           NSLog(@"2");
           // 同步
           dispatch_sync(queue2, ^{
               NSLog(@"3");
           });
            NSLog(@"4");
       });
       NSLog(@"5");
}
  • test1 函數亲善,目標queue當前queue冗疮,并且都為串行隊列喷斋,會導致死鎖培漏。
  • test2 函數兑巾,dispatch_sync當前queuequeue1损姜,目標queuequeue2饰剥,因為queue1和queue2不是同一個隊列,不會造成死鎖摧阅。
-(void) test3 {
    dispatch_queue_t queue = dispatch_queue_create("LY", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}
  • test3 函數汰蓉,dispatch_sync函數的當前queue目標queue為同一個queue。但該隊列為并發(fā)隊列逸尖,并不會造成死鎖古沥。

最后,奉上本文的代碼示例 GCD

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末娇跟,一起剝皮案震驚了整個濱河市岩齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苞俘,老刑警劉巖盹沈,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡乞封,警方通過查閱死者的電腦和手機做裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肃晚,“玉大人锚贱,你說我怎么就攤上這事」卮” “怎么了拧廊?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晋修。 經常有香客問我吧碾,道長,這世上最難降的妖魔是什么墓卦? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任倦春,我火速辦了婚禮,結果婚禮上落剪,老公的妹妹穿的比我還像新娘睁本。我一直安慰自己,他們只是感情好著榴,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布添履。 她就那樣靜靜地躺著,像睡著了一般脑又。 火紅的嫁衣襯著肌膚如雪暮胧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天问麸,我揣著相機與錄音往衷,去河邊找鬼。 笑死严卖,一個胖子當著我的面吹牛席舍,可吹牛的內容都是我干的。 我是一名探鬼主播哮笆,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼来颤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稠肘?” 一聲冷哼從身側響起福铅,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎项阴,沒想到半個月后滑黔,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年略荡,在試婚紗的時候發(fā)現(xiàn)自己被綠了庵佣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡汛兜,死狀恐怖巴粪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情序无,我是刑警寧澤验毡,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站帝嗡,受9級特大地震影響,放射性物質發(fā)生泄漏璃氢。R本人自食惡果不足惜哟玷,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望一也。 院中可真熱鬧巢寡,春花似錦、人聲如沸椰苟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舆蝴。三九已至谦絮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洁仗,已是汗流浹背层皱。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赠潦,地道東北人叫胖。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像她奥,于是被迫代替她去往敵國和親瓮增。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355