GrandCentralDispatch(GCD)



Grand Central Dispatch 簡稱GCD,蘋果在Mac OS X 10.6 ,iOS 4平臺首次發(fā)布,后續(xù)平臺也可用。關于GCD的更多信息,參考官方文檔。
<br >

特性

  • 基于隊列工作 dispatch queue,嚴格按照FIFO(first in first out)
  • 平行排隊特定任務
  • 利用任何可用核心資源(多核處理器)處理任務
  • 任務:函數(shù)(function)、block

<br >

Functions by Task

Main dispatch queue
  • 主線程 queue ,一般用來更新ui,串行地在主線程上執(zhí)行任務
  • main thread 有系統(tǒng)自動創(chuàng)建,并會自動關聯(lián)上你的應用的主線程,若想在應用內(nèi)使用,可使用以下三種方式:
     調(diào)用 dispatch_main
     
     調(diào)用 UIApplicationMain(iOS)或者NSApplicationMain(OS X)
     
     使用 CFRunLoopRef
Concurrent - Global dispatch queue
  • 并行隊列,任務從隊列被列出是按覅佛規(guī)則的,但是回并行執(zhí)行,執(zhí)行完成的順序是隨機的。適合并行處理數(shù)量龐大的任務,GCD可以自動生成四種此類并行隊列,只通過各自的優(yōu)先級不同去區(qū)別開來,當然你可以自己根據(jù)需要定義自己的并行隊列。因為此隊列對于你得應用程序來說是全局的,所以你并不需要關心它的引用計數(shù),即使給它retain或者release,都會被忽略。
    dispatch_get_global_queue(<#dispatch_queue_priority_t priority#>, <#unsigned long flags#>)
    
    DISPATCH_QUEUE_PRIORITY_HIGH 2
    
    DISPATCH_QUEUE_PRIORITY_DEFAULT 0
    
    DISPATCH_QUEUE_PRIORITY_LOW (-2)
    
    DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
Serial - private dispatch queues
  • 通常用于訪問特定資源和數(shù)據(jù),多個serial queue之間同步并發(fā)執(zhí)行,串行fifo隊列,適合用于按指定順序執(zhí)行的任務,保持線程安全,串行同步安全地訪問資源,在應用程序里面,必須明確指定串行隊列,可以已根據(jù)需要創(chuàng)建足夠多的,但不要用serial queue 代替 concurrent queue 處理任務龐大的任務。
    dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)

使用

dispatch_once
  • dispatch_once執(zhí)行一個區(qū)塊對象,在整個應用的生命周期只執(zhí)行一次,非常適合用于已單列模式創(chuàng)建全局的對象。
 Executes a block object once and only once for the lifetime of an application.//官方解釋

   void dispatch_once(
   dispatch_once_t *predicate,
   dispatch_block_t block);
   
//   example
    +(instancetype)shareDefaultManager
    {
    static TBReachabilityManager *_tbDefaultManager = nil;
    static dispatch_once_t once_t;
    dispatch_once(&once_t, ^(){
         _tbDefaultManager = [[self alloc]init];
    });
    
    return _tbDefaultManager;
    }
dispatch_async
  • 提交一個block到一個異步執(zhí)行的隊列,執(zhí)行完成后馬上返回
Submits a block for asynchronous execution on a dispatch queue and returns immediately.

   void dispatch_async(
   dispatch_queue_t queue,
   dispatch_block_t block);

* queue
block提交得目標隊列,在block執(zhí)行完成之前,系統(tǒng)會保留這個queue,值不能為Null

* block
隊列執(zhí)行的目標block,方法會自動執(zhí)行Block_copy和Block_release,值不能為Null

提交bolck到dispatch_queue最基本的方法,隊列決定block執(zhí)行的方式,串行或者并行,當然了,是異步的。

常用的方法

我們在處理一些耗時操作時,比如網(wǎng)絡讀取數(shù)據(jù)、預服務器交互、數(shù)據(jù)庫讀寫、io等,有時執(zhí)行時間過長會導致主界面有卡頓的甚至卡死的情況出現(xiàn),當然這種情況可以使用NSThread、NSOperation解決,但使用dispatch_async更簡單:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 耗時的操作,讀取數(shù)據(jù)、數(shù)據(jù)處理等操作
    dispatch_async(dispatch_get_main_queue(), ^{
        // 更新界面,dispatch_get_main_queue()是切換回主線程隊列的方法
    });
});

dispatch_group_async

  • 以組的方式關聯(lián)一組block,等block都執(zhí)行完成,就發(fā)起完成的通知,group里面的block是并行執(zhí)行的。
    <br >
Submits a block to a dispatch queue and associates the block with the specified dispatch group.

   void dispatch_group_async(
   dispatch_group_t group,
   dispatch_queue_t queue,
   dispatch_block_t block);

使用例子

    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, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"group1");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"group2");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"group3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"updateUi");
    });
    dispatch_release(group);//釋放group

這里面最后還調(diào)用了dispatch_group_notify,因為前面提交的block都被關聯(lián)到同一個group里面,當group里面的block都執(zhí)行完成后,就需要調(diào)用dispatch_group_notify做收尾。

dispatch_apply

  • 多次執(zhí)行傳入的block
Submits a block to a dispatch queue for multiple invocations.

   void dispatch_apply(
   size_t iterations,
   dispatch_queue_t queue,
   void (^block)(
   size_t));
dispatch_apply(10, global, ^(size_t index) {
    // 執(zhí)行10次
});
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

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

  • 簡介 GCD(Grand Central Dispatch)是在macOS10.6提出來的,后來在iOS4.0被引...
    sunmumu1222閱讀 882評論 0 2
  • 本篇博客共分以下幾個模塊來介紹GCD的相關內(nèi)容: 多線程相關概念 多線程編程技術的優(yōu)缺點比較? GCD中的三種隊列...
    dullgrass閱讀 37,875評論 30 236
  • iOS中GCD的使用小結 作者dullgrass 2015.11.20 09:41*字數(shù) 4996閱讀 20199...
    DanDanC閱讀 855評論 0 0
  • 背景 擔心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,262評論 21 42
  • 三嫂是我的近門嫂子,是老家前院堂哥的媳婦,今年五十多歲,頭發(fā)花白滿臉皺紋,看上去就像六十多歲的人,高高的個子,背確...
    何凡閱讀 899評論 2 3