iOS 多線程簡單使用



1.異步執(zhí)行

dispatch_async(dispatch_get_main_queue(), ^{

//打算執(zhí)行的任務(wù)

});

dispatch_async:表示異步執(zhí)行 不用等待里面的代碼執(zhí)行結(jié)束就可以往下執(zhí)行

dispatch_get_main_queue():表示獲取主線程




2.Dispatch Queue 種類

Serial Dispatch Queue:等待現(xiàn)在執(zhí)行中處理結(jié)束才能執(zhí)行其他任務(wù) //串行

Concuerrent Dispatch Queue:不等待現(xiàn)在執(zhí)行中處理結(jié)束就可以執(zhí)行其他任務(wù)? //并行

多個線程更新相同資源時導(dǎo)致數(shù)據(jù)競爭時使用Serial Dispatch Queue 來保證數(shù)據(jù)安全

dispatch_queue_t myqueue1 = dispatch_queue_create("com.GCD.myqueue1", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(myqueue1, ^{

NSLog(@"執(zhí)行的任務(wù)");

});



3.Main Dispatch Queue /Global Dispatch Queue 系統(tǒng)自帶線程

這倆個是系統(tǒng)提供給我們使用的Dispatch Queue,不用我們?nèi)ヌ匾鈩?chuàng)建了

Main Dispatch Queue : 主線程? 因為主線程只有一個所以是Serial Dispatch Queue? 像UI的刷新必須在主線程中進(jìn)行

Global Dispatch Queue : 是所有程序都能夠使用的Concuerrent Dispatch Queue雹食,另外Global Dispatch Queue有四個執(zhí)行優(yōu)先級:

高優(yōu)先級(High Priority)

默認(rèn)優(yōu)先級(Default Priority)

低優(yōu)先級(Low Priority)

后臺優(yōu)先級(Background Priority)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//可并行執(zhí)行的處理

});

在向Global Dispatch Queue追加處理時霞篡,應(yīng)選擇與處理內(nèi)容對應(yīng)執(zhí)行優(yōu)先級的Global Dispatch Queue




4.dispatch_set_target_queue 改變線程優(yōu)先級

dispatch_queue_create函數(shù)生成的Dispatch Queue不管是Serial Dispatch Queue還是Concuerrent Dispatch Queue窥岩,都使用與默認(rèn)優(yōu)先級Global Dispatch Queue相同執(zhí)行優(yōu)先級的線程氛驮,而變更優(yōu)先級就需要使用到dispatch_set_target_queue

dispatch_queue_t mySerialQueue = dispatch_queue_create("com.gcd.mySerialQueue", NULL);

dispatch_queue_t globalQueueBackground =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

dispatch_set_target_queue(mySerialQueue, globalQueueBackground);




5.dispatch_after 延遲執(zhí)行

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);

dispatch_after(time, dispatch_ge? t_main_queue(), ^{

//延遲3秒執(zhí)行的任務(wù)

});

SEC:表示秒

MSEC:毫秒

ull 是C語言中的數(shù)值字面量刹淌,是顯示表明類型時使用的字符串(表示"unsigned long long")




6.Dispatch Group 多個處理全部結(jié)束后想執(zhí)行結(jié)束處理

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();


dispatch_group_async(group, queue, ^{

//任務(wù)1

});

dispatch_group_async(group, queue, ^{

//任務(wù)2

});

dispatch_group_async(group, queue, ^{

//任務(wù)3

});


dispatch_group_notify(group, dispatch_get_main_queue(), ^{

//等待上面三個任務(wù)全部執(zhí)行完畢后祟偷,執(zhí)行結(jié)束處理

});



7.dispatch_barrier_async? 進(jìn)行數(shù)據(jù)庫操作時避免數(shù)據(jù)競爭

寫入數(shù)據(jù)不可與讀取數(shù)據(jù)以及其他寫入操作并行操作彩郊,否則就會發(fā)生問題

dispatch_queue_t queue = dispatch_queue_create("com.gcd.ForBarrier", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });


dispatch_barrier_async(queue, ^{ NSLog(@"寫入操作"); });? //此時不可以讀取數(shù)據(jù)? 可以把其當(dāng)做一個Serial Dispatch Queue


dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });

dispatch_async(queue, ^{? ? NSLog(@"讀取操作");? });




8.dispatch_sync 同步

既然有async 那么就有sync

使用場景:在主線程中使用其他線程進(jìn)行處理前弯,處理結(jié)束后需要立即使用所得到的結(jié)果

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_sync(queue, ^{

//處理任務(wù)

});

正因為其使用簡單,所以也容易引起問題秫逝,死鎖

如果在主線程執(zhí)行以下代碼就會死鎖

dispatch_queue_t queue = dispatch_get_main_queue();

dispatch_sync(queue, ^{

//執(zhí)行任務(wù)

});

該代碼在主線程中執(zhí)行指定block恕出,并等待其執(zhí)行結(jié)束,而其實在主線程中正在執(zhí)行這些代碼筷登,所以無法追加到主線程的block




9.dispatch_apply

按指定的次數(shù)將指定的block追加到指定的線程中剃根,并等待全部處理執(zhí)行結(jié)束

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_apply(10, queue, ^(size_t index) {

NSLog(@"%zu",index);

});

NSLog(@"Done");


執(zhí)行結(jié)果:

6

4

3

7

5

2

1

9

0

8

Done //Done肯定在最后 因為要等待執(zhí)行結(jié)束

推薦在dispatch_async中非同步執(zhí)行dispatch_apply 函數(shù)




10.dispatch_suspend / dispatch_resume 掛起/恢復(fù)

dispatch_suspend(queue);

dispatch_resume(queue);

這些函數(shù)對已經(jīng)執(zhí)行的處理沒有影響哩盲,掛起后前方,追加到線程中但尚未執(zhí)行的處理在此之后停止執(zhí)行狈醉,而恢復(fù)則使得這些處理能夠繼續(xù)執(zhí)行




11.dispatch_once 應(yīng)用程序運(yùn)行期間只執(zhí)行一次

static dispatch_once_t pred;

dispatch_once(&pred, ^{

//進(jìn)行初始化

});

該代碼即使在多線程環(huán)境中執(zhí)行,也可保證百分百安全




12.Dispatch I/O

在讀取較大文件時惠险,如果將文件分成合適的大小并使用Global Dispatch Queue 并列讀取的話苗傅,速度會快上許多。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末班巩,一起剝皮案震驚了整個濱河市渣慕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抱慌,老刑警劉巖逊桦,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抑进,居然都是意外死亡强经,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門寺渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匿情,“玉大人,你說我怎么就攤上這事信殊【娉疲” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵涡拘,是天一觀的道長玲躯。 經(jīng)常有香客問我压怠,道長已脓,這世上最難降的妖魔是什么塘雳? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任襟齿,我火速辦了婚禮呢撞,結(jié)果婚禮上术幔,老公的妹妹穿的比我還像新娘侄柔。我一直安慰自己既们,他們只是感情好仲吏,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布不铆。 她就那樣靜靜地躺著,像睡著了一般裹唆。 火紅的嫁衣襯著肌膚如雪誓斥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天许帐,我揣著相機(jī)與錄音劳坑,去河邊找鬼。 笑死成畦,一個胖子當(dāng)著我的面吹牛距芬,可吹牛的內(nèi)容都是我干的涝开。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼框仔,長吁一口氣:“原來是場噩夢啊……” “哼舀武!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离斩,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤银舱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跛梗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻馏,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年核偿,在試婚紗的時候發(fā)現(xiàn)自己被綠了操软。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡宪祥,死狀恐怖聂薪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝗羊,我是刑警寧澤藏澳,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站耀找,受9級特大地震影響翔悠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野芒,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一蓄愁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狞悲,春花似錦撮抓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荸恕,卻和暖如春乖酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背融求。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工咬像, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓县昂,卻偏偏與公主長得像肮柜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子七芭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

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