歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS線程開發之--BLOCK & GCD(Grand Central Dispatch)

GCD是apple在iOS 4.0之後引入的新多線程方法,它是基於C語言的擴展,

GCD是在內核級提供多線程管理的,效率較高。

GCD的關鍵之一是隊列,系統提供了一些預定義的隊列,其中包括主線程隊列(該隊列保證在主線程上運行),你也可以定義自己的隊列。

GCD隊列是嚴格的FIFO方式工作的,代碼的開始順序與加入隊列的順序相同。(在多核心系統上,代碼塊的完成順序不一定是FIFO的。但是在目前單核的iPhone上不必在意)。

GCD的另一關鍵是引入了block,類似於其它語言的匿名表達式。block可以為變量賦值,可以當作參數傳遞給函數或方法 ,當然也可以執行。

block可以接受參數也可以返回值。block以^定義。形式上類似於以*定義的函數指針。

  1. //聲明block,變量名loggerBlock,無參數無返回   
  2. void (^loggerBlock)(void)  
為該block變量定義代碼  
  1. loggerBlock = ^{ NSLog(@"I’m just glad they didn’t call it a lambda"); };  

執行該block

  1. loggerBlock();    

可以看到block很類似於c時的函數指針。不過block可以以inline方式嵌入代碼。同時block可以訪問上下文中的變量,缺省時block會對訪問的變量進行copy,而不

影響原變量的值。當然可以通過在變量前加 __block修飾符來允許直接改變訪問變量。

  1. // 定義可改變變量   
  2. __block int a = 0;   
  3.    
  4. // 定義block代碼來改變本地變量   
  5. void (^sillyBlock)(void) = ^{ a = 47; };   
  6.    
  7. // block執行前的值   
  8. NSLog(@"a == %d", a); // outputs "a == 0"    
  9.   
  10. // 執行   
  11. sillyBlock();   
  12.    
  13. // 變量被改變   
  14. NSLog(@"a == %d", a); // outputs "a == 47"   

當然Block本身在iOS 4.0以後的API中扮演著舉足輕重的角色,很多新增的API都可以接受BLOCK作為參數。

比如,在數據容器中支持Block來進行自定義判斷:

  1. [someArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {  
  2.         if ([[(someObj *)obj someAttr] isEqualToString:someStr ]) {  
  3.             *stop = YES;  
  4.             return YES;  
  5.         }  
通過BLOCK在遍歷元素過程中直接進行判斷比較,找出容器中相應值的位置。

下面看一下線程相關的函數

當有代碼需要在線程中執行時,可以用dispatch_async函數,該函數接受2個參數:隊列和block。隊列可以是系統預定義隊列,也可以是用戶自定義的。而block的威力

則體現在此,可以直接編寫代碼,上下文一目了然。

  1. - (IBAction)doWork:(id)sender {   
  2.     NSDate *startTime = [NSDate date];   
  3.     dispatch_async(dispatch_get_global_queue(00), ^{   
  4.         //執行計算。。。。    
  5.         NSDate *endTime = [NSDate date];   
  6.         NSLog(@"Completed in %f seconds",    
  7.               [endTime timeIntervalSinceDate:startTime]);   
  8.     });   
  9. }   

此處隊列是用dispatch_get_global_queue(0,0)獲得,前一個參數指定隊列優先級,有DISPATCH_QUEUE_PRIORITY_HIGH , DISPATCH_QUEUE_PRIORITY_LOW, DISPATCH_QUEUE_PRIORITY_DEFAULT (即0),後一個參數未使用,請設為0。

Copyright © Linux教程網 All Rights Reserved