CGD中dispatch_once使用說明(僅執(zhí)行一次)

dispatch_once概念解析

dispatch_onceGrand Central Dispatch(GCD) 中的一種線程安全的單例創(chuàng)建方式乏盐,在 iOS 開發(fā)中常被用來創(chuàng)建全局唯一的單例對(duì)象。其核心是利用 dispatch_once 函數(shù)神凑,確保指定 block 只會(huì)被執(zhí)行一次法竞,并且是線程安全的强挫,也就是說不會(huì)存在多個(gè)線程同時(shí)執(zhí)行該 block 的情況俯渤。

dispatch_once 函數(shù)的聲明如下:

void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);

它包含了一個(gè) predicate 參數(shù)和一個(gè) block 參數(shù)型宝。其中,predicate 是一個(gè)指向 dispatch_once_t 結(jié)構(gòu)體的指針梨树,用來判斷該 block 是否已經(jīng)被執(zhí)行過岖寞。block 則是需要執(zhí)行的單例創(chuàng)建操作。

通常情況下指巡,我們會(huì)在 dispatch_once 函數(shù)中執(zhí)行以下兩個(gè)步驟:

  1. 調(diào)用 dispatch_once 函數(shù)時(shí)隶垮,dispatch_once_t 結(jié)構(gòu)體會(huì)被初始化為 0。
  2. 在 block 中執(zhí)行單例創(chuàng)建操作勉耀,創(chuàng)建成功后將 dispatch_once_t 結(jié)構(gòu)體的值修改為非 0 值蹋偏。

完成上述兩個(gè)步驟后,再次調(diào)用 dispatch_once 函數(shù)時(shí)椭住,由于 dispatch_once_t 的值已經(jīng)被修改為非 0 值字逗,dispatch_once 函數(shù)將不會(huì)再次執(zhí)行 block 中的內(nèi)容宅广,從而確保該單例只會(huì)被創(chuàng)建一次。

整個(gè)程序運(yùn)行中只會(huì)執(zhí)行一次俭厚,使用dispatch_once可以簡(jiǎn)化代碼并且徹底保證線程安全驶臊,開發(fā)者根本無須擔(dān)心加鎖或者同步叼丑。所有問題都由GCD在底層處理扛门。由于每次調(diào)用時(shí)都必須使用完全相同的標(biāo)記,所以標(biāo)記要聲明成static星立。所以用在單例模式上是最好的

下面是一個(gè)使用 dispatch_once 函數(shù)創(chuàng)建單例的例子:

+ (instancetype)sharedInstance {
    static MySingleton *instance;
    static dispatch_once_t dispatchOnceToken;
    dispatch_once(&dispatchOnceToken, ^{
        instance = [[MySingleton alloc] init];
    });
    return instance;
}

此代碼中绰垂,dispatch_once_t 結(jié)構(gòu)體的值將在整個(gè)應(yīng)用程序生命周期內(nèi)只初始化一次火焰。另外,使用 GCD 的單例創(chuàng)建方式昌简,可以減少線程沖突,提高代碼的性能和可讀性纺酸。

使用場(chǎng)景

dispatch_once一般使用在單例模式上,其要點(diǎn)是整個(gè)程序運(yùn)行中只會(huì)執(zhí)行一次餐蔬。當(dāng)然只要是那些只需要執(zhí)行一次的方法佑附,用dispatch_once最簡(jiǎn)單最安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末词爬,一起剝皮案震驚了整個(gè)濱河市顿膨,隨后出現(xiàn)的幾起案子叽赊,更是在濱河造成了極大的恐慌,老刑警劉巖囊咏,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霜第,居然都是意外死亡户辞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門末誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喇澡,“玉大人,你說我怎么就攤上這事殊校。” “怎么了呕屎?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秀睛,是天一觀的道長(zhǎng)莲祸。 經(jīng)常有香客問我,道長(zhǎng)锐帜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任允瞧,我火速辦了婚禮蛮拔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸典。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布惋砂。 她就那樣靜靜地躺著,像睡著了一般酝掩。 火紅的嫁衣襯著肌膚如雪眷柔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天镶苞,我揣著相機(jī)與錄音鞠评,去河邊找鬼。 笑死聋涨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牍白。 我是一名探鬼主播抖棘,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钉答,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了数尿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诊杆,失蹤者是張志新(化名)和其女友劉穎何陆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贷盲,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剥扣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年钠怯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晦炊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡断国,死狀恐怖榆苞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情语稠,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布输涕,位于F島的核電站慨畸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寸士。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一乃正、第九天 我趴在偏房一處隱蔽的房頂上張望婶博。 院中可真熱鬧,春花似錦凡人、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睛藻。三九已至堂油,卻和暖如春碧绞,著一層夾襖步出監(jiān)牢的瞬間府框,已是汗流浹背迫靖。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工系宜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盹牧。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓励幼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苹粟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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