1 前言
以前也有介紹過GCD,但是感覺不夠深入,今天我們來重新認識一下這個概念,GCD即Grand Central Dispatch(中文直譯宏偉的中心派遣o(s□t)o)。它的一個重要概念是隊列。系統提供了許多預定義的隊列,包括可以保證始終在主席那成上執行其工作的隊列。
2 詳述
GCD嚴格遵循FIFO(先進先出)原則。添加到GCD隊列的工作始終按照這個加入隊列的順序啟動。盡管如此,他們不會總是按照相同的順序完成,因為如果可能,GCD隊列將自動在多個線程之間分配它的工作。
我們可以將將GCD理解為一個線程池。
跟GCD相關的是一種成為程序塊的語言功能,這是向C語言本身添加的一些新語法。這對於充分的利用GCD非常重要。程序塊背後的理念是像任何其他C語言類型一樣的對待特定的代碼塊。程序塊可以分配給一個變量,以參數的形式傳遞給函數或者方法。當然也可以執行。通過這種方式,程序塊可用作Objective-C中的委托模式或者C中的回調函數的代替路徑。
程序塊非常類似於方法或者函數,程序塊可以接受一個或者多個參數並指定一個返回值。要聲明程序塊變量,可以使用“^”符號以及其他一些放在圓括號內的代碼來聲明參數和返回類型。要定義程序塊本身,執行的操作大體相同,但在後面會添加定義程序塊的實際代碼,包含在花括號內。例子:
//聲明一個沒有參數和返回值的block變量 叫做loggerBlock
void(^loggerBlock)(void);
//實例化這個block
loggerBlock = ^{NSLog(@“I'm just glad they didn't call it a bug”);};
//執行這個block,就像調用函數一樣
loggerBlock();
如果想要block中能修改外部的變量,需要在聲明變量之前添加存儲修飾符__block,進行外部變量“讀/寫”。、注意block前面有兩條下劃線,而不是一條.
//定義一個可以改變的塊變量
__block int a = 0;
//定義一個快修改a變量
void(^sillyBlock)(void) = ^{a = 47;};
//在調用塊之前檢查a變量
NSLog(@"a ==%d",a);//outputs "a==0"
//執行塊
sillyBlock();
//調用之後檢查a的值
NSLog(@"a==%d",a);//outputs “a==47”
3 結語
以上是所有內容,希望對大家有所幫助。