GCD

GCD編程

⺫⽬目錄

⼀一、GCD的隊列dispatch_queue_t

1、簡介

2、創建1)create⽅方法

2)get系統⽅方法

3、修改create⽅方法創建的隊列優先級⼆二、GCD的使⽤用⽅方法1、使⽤用步驟
2、代碼⽰示例

三、GCD的其他⽅方法

1dispatch_after-------------------------指定時間後追加2dispatch_group_t-----------------------處理組3dispatch_barrier_async-----------------queue中等待A執⾏行後繼續queue中追加到其他4dispatch_sync--------------------------同步5dispatch_apply-------------------------指定次數的重複追加6dispatch_suspend&dispatch_resume-------暫停和繼續7dispatch_semaphore_t-------------------設置計數點8dispatch_once_t------------------------只執⾏行⼀一次

⼀一、GCD的隊列dispatch_queue_t
1、簡介
dispatch_queue_t queue:執⾏行處理的等待隊列可以將需要處理的代碼塊添加到這個隊列中

queue的分類:Serial順序 Concurrent並⾏行2、創建

有兩種⽅方法,分別是create⽣生成與get系統提供的

1)create queue:
dispatch_queue_create("", NULL)
//第⼀一個參數

queue的名字,第⼆二個參數爲NULL表⽰示Serial順序,這個只⽤用於防⽌止

多對⼀一的數據競爭時

dispatch_queue_create("",DISPATCH_QUEUE_CONCURRENT)//第⼀一個參數是queue的名字,第⼆二個參數爲DISPATCH_QUEUE_CONCURRENT表⽰示Concurrent並⾏行

dispatch_release(queue);//createqueue需要在結束使⽤用後⼿手動進⾏行release

2)系統queue:分爲Main主線程(也是⼀一個Serial)Global分線程(也是Concurrent)

            Main:dispatch_queue_t queue =
dispatch_get_main_queue();

Global://有四個優先級dispatch_queue_t queue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)//第⼀一個參數爲優先級,這⾥裏爲⾼高優先級,第⼆二個⽬目前未使⽤用,並且應該始終爲0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF

AULT, 0)//第⼀一個參數爲優先級,這⾥裏爲默認優先級,第⼆二個⽬目前未使⽤用,並且應該始終爲0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW

, 0)//第⼀一個參數爲優先級,這⾥裏爲低優先級,第⼆二個⽬目前未使⽤用,並且應該始終爲0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BAC

KGROUND, 0)//第⼀一個參數爲優先級,這⾥裏爲後臺優先級,第⼆二個⽬目前未使⽤用,並且應該始終爲0

3、修改create⽅方法創建的隊列優先級

create創建的queue默認爲GlobalDEFAULT優先級,可以通過dispatch_set_target_queue(originQueue,targetQueue);//進⾏行修改,第⼀一個參數爲希望修改的queue,第⼆二個參數爲修改後的⽬目標queue,且第⼀一個queue必須爲create創建的,不能使系統的Main或者Globalqueue。第⼆二個queue應該是通過Global創建的某種優先級的queue

⼆二、GCD的使⽤用⽅方法1、使⽤用步驟

first:使⽤用create或者系統⽅方法創建⼀一個queue

second:使⽤用dispatch_async(someQueue, ^{});執⾏行多線程的block⽅方法

third:在上⾯面多線程的block相應位置調⽤用dispatch_async(dispatch_get_main_queue(), ^{});回到主線程進⾏行操作

fourth:如果queue時通過create創建的,使⽤用dispatch_release(someQueue);進⾏行釋放

2、代碼⽰示例
dispatch_queue_t tempQueue =

dispatch_queue_create("com.llz.gcd.temp", NULL);
    dispatch_async(tempQueue,
                   ^{
                       //do something
dispatch_async(dispatch_get_main_queue(),

^{

//do

sometingdispatch_release(tempQueue);//因爲是create出來的,所

以需要release三、GCD的其他⽅方法

1dispatch_afterdispatch_after://在⼀一個時間段後向某個queue中添加⼀一個

block⽅方法

dispatch_time_t time =dispatch_time(DISPATCH_TIME_NOW,(int64_t)3*NSEC_PER_SEC);//可以獲得⼀一個距某個時間點相當時長的時間,第⼀一個參數爲開始時間,現在設置的爲當前時間,第⼆二個參數爲時間流失的數值,現在是3s

    dispatch_after(time, dispatch_get_main_queue(),
                   ^{
                       NSLog(@"hello");

});

});

});//使⽤用dispatch_after⽅方法,在time後向主線程隊列添加⼀一個block⽅方法

注意:dispatch_afterperformSelector:withObject:afterDelay:的區別,後者爲相應時間後執⾏行該⽅方法;前者爲相應時間後向隊列添加⽅方法,⽽而這個⽅方法並不⼀一定⽴立刻執⾏行
2dispatch_group_t

dispatch_group_t:多線程組,將⼀一些queue,添加到這個中,可以實現監測這些queue全部完成的狀態,如果爲Serial就沒有使⽤用這個的必要了

dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//創建queue

dispatch_group_t group =dispatch_group_create();//創建group

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法,第⼀一個參數爲組名,第⼆二個參數爲queue名,第三個參數爲block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);//可以通過wait⽅方法設置監測時間,現在設置的是永遠,也能⽤用dispatch_time_t進⾏行特定時間的設定

dispatch_release(group);//因爲是create出來的,所以需要release

3dispatch_barrier_asyncdispatch_barrier_async(someQueue, ^{}):⽤用於在某些⼀一

些動作中插⼊入⼀一些動作,⼀一般配合create出來的concurrent類型

queue使⽤用,Serial就沒有使⽤用這個的必要了dispatch_queue_t queue =

dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{});dispatch_async(queue, ^{});dispatch_async(queue, ^{});dispatch_barrier_async(queue, ^{});//會將queue對應

block⽅方法加⼊入queue,並等此⽅方法結束後再繼續queue⾥裏的剩下block⽅方法

    dispatch_async(queue, ^{});
    dispatch_async(queue, ^{});

dispatch_release(queue);//因爲是create出來的,所以需要release

4dispatch_sync

dispatch_sync(someQueue, ^{})dispatch_barrier_sync(someQueue, ^{})同步運⾏行,會死鎖,但是不要⽤用在MainThread或者在⾮非concurrent的本⾝身queue⾥裏⾯面進⾏行⾃自⼰己的sync
5dispatch_apply

dispatch_apply(10, someQueue, ^{}):⽤用於將某個block代碼塊按指定次數重複追加到queue中,並等待這些block全部執⾏行完畢,所以推薦⽤用在async

    NSArray *array = [NSArray
arrayWithObjects:@"",@"",@"",@"",@"",@"",@"", nil];
    dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF
AULT, 0);
    dispatch_async(queue,
                   ^{
                       dispatch_apply(array.count,

queue, ^(size_t index)//會將數組的長度作爲次數,將block

碼塊添加到queue中,並等待其中所有block執⾏行完畢{

NSLog(@"%@",[array objectAtIndex:index]);

});

dispatch_suspend(someQueue)&dispatch_resume(someQueue):⽤用於將掛起時queue中尚未執⾏行的處理停⽌止以及繼續開始7dispatch_semaphore_t

dispatch_semaphore_t:計數信號,爲了更細分的保證不會造成程序的變量被同時訪問

    dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF
AULT, 0);

dispatch_semaphore_t semaphore =dispatch_semaphore_create(1);//初始化semaphore的計數,並設最⼤大爲1

    NSMutableArray *array = [NSMutableArray
arrayWithCapacity:0];

for(int i = 0;i<10000;i++)//在循環中如果不⽤用semaphore,則async出來的線程們可能會同時訪問array,造成異常

    {
        dispatch_async(queue,

^{

dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);//第⼀一個參數爲技術信號,第⼆二個參數爲等待時間,現在是⼀一直等待直到semaphore的值等於1

[array addObject:[NSNumbernumberWithInt:i]];//排他成功後,即semaphore等於1時,執⾏行數

組添加對象操作,同時將semaphore值變爲0dispatch_semaphore_signal(semaphore);//semaphore的值

6dispatch_suspend&dispatch_resume

增爲1}

});

});

dispatch_release(semaphore);//因爲是create出來的,所以需要release

8dispatch_once_tdispatch_once_t:保證其block塊在應⽤用中只執⾏行⼀一次

    +(MyClass *)sharedInstance
    {
        static MyClass *sharedManager;

static dispatch_once_t onceToken;//通過這個onceToken使得下⾯面的實例化只做⼀一次

        dispatch_once(&onceToken, ^{
            sharedManager = [[MyClass alloc] init];
        });
        return sharedManager;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章