歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> iOS線程開發之--BLOCK & GCD(Grand Central Dispatch)

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

日期:2017/3/1 10:29:06   编辑:Linux編程

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. // 定義block代碼來改變本地變量
  4. void (^sillyBlock)(void) = ^{ a = 47; };
  5. // block執行前的值
  6. NSLog(@"a == %d", a); // outputs "a == 0"
  7. // 執行
  8. sillyBlock();
  9. // 變量被改變
  10. 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(0, 0), ^{
  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