IOS多線程-GCD

GCD

什么是GCD

  • 全稱是Grand Central Dispatch粘室,可譯為“強(qiáng)大的調(diào)度器”
    純C語言切威,提供了非常多強(qiáng)大的函數(shù)

GCD的優(yōu)勢

  • GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案
  • GCD會自動利用更多的CPU內(nèi)核(比如雙核、四核)
  • GCD會自動管理線程的生命周期(創(chuàng)建線程先朦、調(diào)度任務(wù)犬缨、銷毀線程)
  • 程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼

GCD的核心概念

  • 任務(wù):想要做什么事情

  • 隊(duì)列:執(zhí)行任務(wù)的順序

  • 步驟:

    • 寫好自己想要執(zhí)行的任務(wù)
    • 放在隊(duì)列里等待執(zhí)行(FIFO,GCD會根據(jù)隊(duì)列的順序進(jìn)行自動取出執(zhí)行,并且根據(jù)情況創(chuàng)建線程)

隊(duì)列的類型

  • 并發(fā)隊(duì)列
    • 隊(duì)列里的任務(wù)會自動開啟多個線程并發(fā)執(zhí)行,但是需要異步函數(shù)的任務(wù)才有效
    • 隊(duì)列只是影響任務(wù)執(zhí)行的方式,實(shí)際上并不能決定是否開啟新的線程,僅僅是并發(fā)隊(duì)列允許多個線程同時運(yùn)行,而串行隊(duì)列只能是一個一個任務(wù)在同一線程執(zhí)行.
    • 如何創(chuàng)建并發(fā)隊(duì)列
//通過直接創(chuàng)建的方式創(chuàng)建,參數(shù)決定是否是并發(fā)隊(duì)列
//DISPATCH_QUEUE_CONCURRENT代表并發(fā)隊(duì)列
//DISPATCH_QUEUE_SERIAL或NULL代表串行隊(duì)列
//標(biāo)示符代表這個隊(duì)列的一個標(biāo)記
dispatch_queue_t queue = dispatch_queue_create("標(biāo)示符", DISPATCH_QUEUE_CONCURRENT);

//通過獲取全局隊(duì)列來獲得一個并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//這兩個參數(shù),第一個是優(yōu)先級一般用默認(rèn),第二個直接設(shè)為0 是一個保留標(biāo)記,實(shí)際作用不大
  • 串行隊(duì)列
    • 隊(duì)列里的任務(wù)會以串行的形式一個一個按順序執(zhí)行
    • 如何創(chuàng)建串行隊(duì)隊(duì)列
//直接創(chuàng)建
//DISPATCH_QUEUE_SERIAL或NULL代表串行隊(duì)列
dispatch_queue_t queue = dispatch_queue_create("標(biāo)示符", DISPATCH_QUEUE_SERIAL);
//獲得主隊(duì)列,也是一種串行隊(duì)列
dispatch_queue_t queue = dispatch_get_main_queue();
  • 同步函數(shù)與異步函數(shù)
  • 異步函數(shù)具有創(chuàng)建線程的能力,同步函數(shù)并沒有.
  • 同步函數(shù)如何創(chuàng)建
//queue代表你要放入的隊(duì)列
dispatch_sync(queue, ^{
        //在這里寫要執(zhí)行的代碼
    });
  • 異步函數(shù)如何創(chuàng)建
//queue代表你要放入的隊(duì)列
dispatch_async(queue, ^{
        //在這里寫要執(zhí)行的代碼
    });
  • 柵欄函數(shù)
//隔斷函數(shù),前面執(zhí)行完才會執(zhí)行這個函數(shù),這個函數(shù)執(zhí)行完才會執(zhí)行其他后面的函數(shù)
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
//全局并發(fā)情況下有問題

不同的隊(duì)列與函數(shù)的組合會有不同的效果

  • 并行隊(duì)列+異步函數(shù):創(chuàng)建新的線程,并行執(zhí)行任務(wù)
  • 并行隊(duì)列+同步函數(shù):沒有新的線程,串行執(zhí)行任務(wù)
  • 串行隊(duì)列+異步函數(shù):創(chuàng)建新的線程,串行執(zhí)行任務(wù)
  • 串行隊(duì)列+同步函數(shù):沒有新的線程,串行執(zhí)行任務(wù)
  • 主隊(duì)列+異步函數(shù):沒有新的線程,串行執(zhí)行任務(wù)
  • 主隊(duì)列+同步函數(shù):沒有新的線程,串行執(zhí)行任務(wù)

線程之間通信示例

  • 一個示例,簡單的表示了如何在不同的隊(duì)列之間做事情
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //在這里寫上放在全局隊(duì)列的代碼
        dispatch_async(dispatch_get_main_queue(), ^{
            //寫在這里就是執(zhí)行主函數(shù)的代碼
        });
    });

IOS上常見的延時代碼

//調(diào)用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后再調(diào)用self的run方法

//使用GCD函數(shù)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 2秒后執(zhí)行這里的代碼...
});

//使用NSTimer
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];

Once代碼,在整個程序運(yùn)行時只執(zhí)行一次

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // 只執(zhí)行1次的代碼(這里面默認(rèn)是線程安全的)
});

快速迭代代碼

dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index){
    // 執(zhí)行10次代碼,index順序不確定
});

分組隊(duì)列

  • 當(dāng)需要對隊(duì)列分組時,而且有先后執(zhí)行順序的需求的時候可以進(jìn)行組
//創(chuàng)建一個組組隊(duì)隊(duì)列
dispatch_group_t group =  dispatch_group_create();
//使用組隊(duì)列異步函數(shù),分別有組隊(duì)列,和隊(duì)列的參數(shù).
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執(zhí)行1個耗時的異步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 執(zhí)行1個耗時的異步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 等前面的異步操作都執(zhí)行完畢后,回到主線程...
});

IOS中的單例模式

  • 單例模式的作用

    • 可以保證在程序運(yùn)行過程嗡害,一個類只有一個實(shí)例,而且該實(shí)例易于供外界訪問
    • 從而方便地控制了實(shí)例個數(shù)霸妹,并節(jié)約系統(tǒng)資源
  • 單例模式的使用場合

    • 在整個應(yīng)用程序中,共享一份資源(這份資源只需要創(chuàng)建初始化1次)
  • 單例模式標(biāo)準(zhǔn)化代碼

  • 可以吧指針變?yōu)閕d類型,實(shí)例變量名定義為instance這樣就可以在多處使用了.

#import "Person.h"
@interface Person() <NSCopying>

@end

@implementation Person
//聲明一個全局變量指針,代表唯一的實(shí)例
static Person *_person;
//重寫alloc中實(shí)際起作用的部分,allocWihtZone,所以從始至終就只有一份存儲空間.
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    //在程序整個生命過程中只運(yùn)行一次的代碼
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        _person = [super allocWithZone:zone];
    });
    return _person;
}

//生成一個完整的對象
+ (instancetype)shareWihtPerson
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [[Person alloc] init];
    });
    return _person;
}

//防止使用copy拷貝出新的對象
- (id)copyWithZone:(NSZone *)zone
{
    return _person;
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市台盯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌静盅,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒿叠,死亡現(xiàn)場離奇詭異,居然都是意外死亡栈虚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門曼验,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鬓照,你說我怎么就攤上這事〔蝰桑” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵臭猜,是天一觀的道長押蚤。 經(jīng)常有香客問我蔑歌,道長揽碘,這世上最難降的妖魔是什么园匹? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任劫灶,我火速辦了婚禮裸违,結(jié)果婚禮上本昏,老公的妹妹穿的比我還像新娘供汛。我一直安慰自己凛俱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布蒲犬。 她就那樣靜靜地躺著,像睡著了一般原叮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奋隶,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音唯欣,去河邊找鬼。 笑死境氢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萍聊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼此衅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挡鞍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匕累,失蹤者是張志新(化名)和其女友劉穎默伍,沒想到半個月后欢嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也糊,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年狸剃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞馁。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖探颈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伪节,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布怀大,位于F島的核電站,受9級特大地震影響化借,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓖康,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一局服、第九天 我趴在偏房一處隱蔽的房頂上張望钓瞭。 院中可真熱鬧淫奔,春花似錦山涡、人聲如沸唆迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鼠哥,卻和暖如春看政,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背允蚣。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嚷兔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓冒晰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壶运。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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

  • 多線程學(xué)習(xí)筆記-GCD 我把這篇文章所用到的代碼總結(jié)到這里->GCD項(xiàng)目總結(jié)下載地址-GCD-wxk可以下載參考 ...
    wxkkkkk閱讀 537評論 0 2
  • 目錄:iOS多線程(一)--pthread、NSThreadiOS多線程(二)--GCD詳解iOS多線程(三)--...
    Claire_wu閱讀 1,076評論 0 6
  • 從哪說起呢秫逝? 單純講多線程編程真的不知道從哪下嘴。违帆。 不如我直接引用一個最簡單的問題,以這個作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,766評論 1 17
  • 前言 嘿嘿嘿刷后,精品。 概述 全稱是Grand Central Dispatch尝胆,可譯為“牛逼的中樞調(diào)度器”。純C語...
    Ostkaka丶閱讀 1,105評論 0 12
  • 高中含衔,人結(jié)束青少年,跨入成年的一個進(jìn)階贪染。 高中三年是我們?nèi)松凶蠲篮玫臅r候,也是讓我們最難忘的杭隙。 屬于我們自己...
    0b1086b283cf閱讀 192評論 0 0