GCD編程簡介dispatch_group_async

一、用 GCD 將任務分組

GCD讓我們創建組,這些組允許你把任務放到一個位置,然後全部運行,運行結束後

Tags: dispatch_asyncdispatch_group_tGCD

會從 GCD 收到一個通知。這一點有很多有價值的用途。例如,假設你有一個 UI-Base APP,想在 UI 上重新加載組件。你有一個表格視圖,一個滾動視圖,一個圖片視圖,就要 用這些方法加載這些組建的內容.

在 GCD 中使用組的時候你應該知道 4 個函數:

dispatch_group_create

創建一個組句柄。一旦你使用完了這個組句柄,應該使用 dispatch_release 函數將其釋 放。

dispatch_group_async

在一個組內提交一個代碼塊來執行。必須明確這個代碼塊屬於哪個組,必須在哪個派送隊列上執行。

dispatch_group_notify

允許你提交一個 Block Object。一旦添加到這個組的任務完成執行之後,這個 Block Object 應該被執行。這個函數也允許你明確執行 Block Object 的分派隊列。

dispatch_release這個函數釋放那任何一個你通過 dispatch_group_create 函數創建的分派小組。

1、dispatch_group_async

Code example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
dispatch_group_t taskGroup=dispatch_group_create();
dispatch_queue_t mainQueue1=dispatch_get_main_queue();
//reload the table view on the main queue
 
dispatch_group_async(taskGroup, mainQueue1, ^{
//method 1
NSLog(@"method1—–");
});
 
dispatch_group_async(taskGroup, mainQueue1, ^{
//method 2
NSLog(@"method2—-");
});
 
//at the end when we are done,dispatch the following block
dispatch_group_notify(taskGroup, mainQueue1, ^{
NSLog(@"finished");
[[[UIAlertView alloc] initWithTitle:@"Finished"
message:@"All tasks are finished" delegate:nil
cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
});
 
//we are done with the group
dispatch_release(taskGroup);

2、也可以分派異步的 C 函數到一個分派組來使用 dispatch_group_async_f 函數

Code example
1
2
3
4
5
6
7
8
9
10
11
dispatch_group_t taskGroup = dispatch_group_create();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_group_async_f(taskGroup, mainQueue,
(__bridge void *)self, reloadAllComponents);
 
/* At the end when we are done, dispatch the following block */ dispatch_group_notify(taskGroup, mainQueue, ^{
/* Do some processing here */[[[UIAlertView alloc] initWithTitle:@"Finished"
});
 
/* We are done with the group */
dispatch_release(taskGroup);

二、用 GCD 構建自己的分派隊列

利用 GCD,你可以創建你自己的串行分派隊列,串行調度隊列按照先入先出(FIFO)的原則運行它們的任務。然而,串行隊列上的異步任務不會在主 線程上執行,這就使得串行隊列極需要併發 FIFO 任務。所有提交到一個串行隊列的同步 任務會在當前線程上執行,在任何可能的情況下這個線程會被提交任務的代碼使用。但是提 交到串行隊列的異步任務總是在主線程以外的線程上執行

Code example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dispatch_queue_t firstSerialQueue = dispatch_queue_create("com.pixolity.GCD.serialQueue1", 0); dispatch_async(firstSerialQueue, ^{
NSUInteger counter = 0;
for (counter = 0; counter < 5; counter++){
NSLog(@"First iteration, counter = %lu", (unsigned long)counter); }
});
dispatch_async(firstSerialQueue, ^{
NSUInteger counter = 0;
 for (counter = 0;counter < 5;counter++){
NSLog(@"Second iteration, counter = %lu", (unsigned long)counter);
 
} });
 
dispatch_async(firstSerialQueue, ^{
 NSUInteger counter = 0;
for (counter = 0;counter < 5;counter++){
NSLog(@"Third iteration, counter = %lu", (unsigned long)counter);
 
} });
 
dispatch_release(firstSerialQueue);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章