工欲善其事,必先利其器系列之 封裝GCD以及介紹如何使用


文章出處:

http://www.cnblogs.com/YouXianMing/p/3659204.html

感謝@YouXianMing 的分享,其封裝的GCD工具能大大簡(jiǎn)化使用,下面是簡(jiǎn)單的用法介紹,詳情請(qǐng)戳上面鏈接查看:

1. 系統(tǒng)并發(fā)線程隊(duì)列

  [[GCDQueue globalQueue] execute:^{
        // 在系統(tǒng)默認(rèn)級(jí)別的線程隊(duì)列中執(zhí)行并發(fā)的操作
    }];

實(shí)際上是在這個(gè)線程隊(duì)列中dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)執(zhí)行操作
這個(gè)并發(fā)隊(duì)列是不能更改的,所以,你調(diào)用方法dispatch_suspend,dispatch_resume以及dispatch_set_context等等,都是沒有效果的.被提交到這個(gè)線程隊(duì)列的block將會(huì)被并發(fā)的執(zhí)行,不存在先后順序.

2. 系統(tǒng)串行線程隊(duì)列

    [[GCDQueue mainQueue] execute:^{
        // 在系統(tǒng)主線程隊(duì)列中執(zhí)行串行操作
    }];

主線程隊(duì)列是被系統(tǒng)自動(dòng)創(chuàng)建的,用來(lái)關(guān)聯(lián)上你的應(yīng)用的主線程.

As with the global concurrent queues, calls to dispatch_suspend, dispatch_resume, dispatch_set_context, and the like have no effect when used with queues returned by this function.

作為全局的并發(fā)隊(duì)列,調(diào)用dispatch_suspend,dispatch_resume,dispatch_set_context類似的方法都將無(wú)效.

只有上一個(gè)block執(zhí)行完畢了才會(huì)執(zhí)行下一個(gè)block

   [[GCDQueue globalQueue] execute:^{
        // 并發(fā)線程執(zhí)行阻塞操作
        
        [[GCDQueue mainQueue] execute:^{
            // 主線程更新UI
        }];
    }];

3. 在某個(gè)指定的隊(duì)列中執(zhí)行延時(shí)操作

  [[GCDQueue globalQueue] execute:^{
        
        // 延時(shí)3秒后執(zhí)行操作
        
    } afterDelay:3 * NSEC_PER_SEC];

將一個(gè)要執(zhí)行的并設(shè)定了時(shí)間block插入隊(duì)列.

這個(gè)方法會(huì)等到指定的時(shí)間,異步的將block添加到指定的隊(duì)列中.

4. 在group中監(jiān)聽某些線程完成了,之后再執(zhí)行某個(gè)線程

    GCDGroup *group = [GCDGroup new];

    [[GCDQueue globalQueue] execute:^{
        // 代碼
    } inGroup:group];
    
    [[GCDQueue globalQueue] execute:^{
        // 代碼
    } inGroup:group];
    
    [[GCDQueue globalQueue] execute:^{
        // 代碼
    } inGroup:group];
    
    [[GCDQueue globalQueue] notify:^{
        // 監(jiān)聽group中的其他的任務(wù)完成后才會(huì)執(zhí)行到此處
    } inGroup:group];

這個(gè)方法安排了一個(gè)通知用的block到這個(gè)指定的queue當(dāng)中,而當(dāng)所有與這個(gè)group相關(guān)聯(lián)的block都執(zhí)行完畢了,才會(huì)執(zhí)行這個(gè)通知的block.如果這個(gè)組空了,那這個(gè)通知用的block就會(huì)被立即的執(zhí)行.

5. 使用定時(shí)器

    GCDTimer *timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];
    [timer event:^{
        
        // 每1秒執(zhí)行一次你的event
        
    } timeInterval:1 * NSEC_PER_SEC];
    [timer start];
注意:↓↓↓↓此定時(shí)器不能暫停,只能銷毀后釋放掉對(duì)象. ↓↓↓↓
 [timer destroy];
  [timer dispatchRelease];

6. 使用信號(hào)量

 GCDSemaphore *sem = [[GCDSemaphore alloc] init];
    
    GCDTimer *timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];
    [timer event:^{
        [sem signal];
    } timeInterval:NSEC_PER_SEC];
    [timer start];
    
    [[GCDQueue globalQueue] execute:^{
        while (1)
        {
            [sem wait];
            NSLog(@"Y.X.");
        }
    }];

一個(gè)發(fā)送信號(hào),一個(gè)接受信號(hào)
發(fā)送信號(hào)增加一個(gè)信號(hào)量.

增加一個(gè)信號(hào)量,如果當(dāng)前值小于或者等于0,這個(gè)方法會(huì)喚醒某個(gè)使用了dispatch_semaphore_wait的線程.

如果這個(gè)線程已經(jīng)喚醒了,將會(huì)返回非0值,否則返回0

下載地址:
http://pan.baidu.com/s/1zTUR8

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS 多線程系列 -- 基礎(chǔ)概述iOS 多線程系列 -- pthreadiOS 多線程系列 -- NSThrea...
    shannoon閱讀 994評(píng)論 0 2
  • 一. 重點(diǎn): 1.dispatch_queue_create(生成Dispatch Queue) 2.Main D...
    BestJoker閱讀 1,685評(píng)論 2 2
  • iOS中GCD的使用小結(jié) 作者dullgrass 2015.11.20 09:41*字?jǐn)?shù) 4996閱讀 20199...
    DanDanC閱讀 1,321評(píng)論 0 0
  • GCD筆記 總結(jié)一下多線程部分,最強(qiáng)大的無(wú)疑是GCD,那么先從這一塊部分講起. Dispatch Queue的種類...
    jins_1990閱讀 840評(píng)論 0 1
  • 2016/09/19 我打上日期 9/19 然后一點(diǎn)點(diǎn)退回去,在9前加上了0 09/19 我反復(fù)登上幾個(gè)網(wǎng)站,查看...
    VVincy_一的菌閱讀 248評(píng)論 0 0

友情鏈接更多精彩內(nèi)容