OC中多線程編程的核心就是block與gcd。這雖然是兩種不同的技術,但他們是一併引入的。block是一種可在C、C++及OC代碼中使用的“詞法閉包”(lexical closure),它極爲有用,藉此機制,開發者可將代碼像對象一樣傳遞,令其在不同環境(context)下運行。在block的範圍內,它可以訪問到其中的全部變量。
gcd是一種與block有關的技術,它提供了對線程的抽象,而這種抽象基於“派發隊列”(dispatch queue)。開發者可將block排入隊列中,有gcd負責處理所有調度事宜。gcd會根據系統資源情況,適時得創建、複用、摧毀後臺線程,以便處理每個隊列。此外,使用GCD還可以方便的完成常見編程任務,比如編寫“只執行一次的線程安全代碼”(thread-safe single-code execution),或者根據可用的系統資源來併發執行多個操作。
block和gcd是當前OC的編程基石。因此必須理解其工作原理及功能
第37條:理解block這一概念
block可以實現閉包。這項語言特性是作爲擴展而加入GCC編譯器中的,在近期版本的Clang中都可以使用。從技術上講,這是位於C語言層面的特性,因此只要有支持此特性的編譯器以及能執行block的運行期組件,就可以在C、C++、OC,PC++代碼中使用它。
block的基礎知識
- void (^someBlock)() = ^{
- //Block implementation here
- };
- int additional = 5;
- int(^addBlock)(int a ,int b) = ^(int a,int b){
- return a+b+additional;
- };
- int add = addBlock(2,5);//add = 12
- NSArray *array = @[@0,@1,@2,@3,@4,@5];
- __block NSInteger count =0;
- [array enumerateObjectUsingBlock:^(NSNumber* number,NSUInteger idx, BOOLBOOL *stop){
- if([number compare:@2]==NSOrderAscending){
- count++;
- }
- }];
- //count =2
block的內部結構
- void (^block)();
- if(/*some condition*/){
- block = ^{NSLog(@"Block A");};
- }else {
- block = ^{NSLog(@"Block B");};
- }
- block();
- void (^block)();
- if(/*some condition*/){
- block = [^{NSLog(@"Block A");} copy];
- }else {
- block = [^{NSLog(@"Block B");}copy];
- }
- block();
第38條:爲常用的塊類型創建typedef
- //before
- -(void)startWithCompletionHandler:(void (^) (NSData *data,NSError *error))completion;
- //after
- typedef void(^EOCCompletionHandler) (NSData *data,NSError *error);
- -(void)startWithCompletionHandler:(EOCCompletionHandler)completion;
第39條:用handler block降低代碼分散程度
第40條:用block引用其所屬對象時不要出現循環引用
- 頂
- 1