GCD中的dispatch_apply的用法及作用


GCD中的dispatch_apply的用法及作用

(一)dispatch_apply的基本用法

dispatch_apply函數是dispatch_sync函數和Dispatch Group的關聯API,該函數按指定的次數將指定的Block追加到指定的Dispatch Queue中,並等到全部的處理執行結束

 1 /*!
 2  *  @brief  dispatch_apply的用法
 3  */
 4 - (void)dispatchApplyTest1 {
 5     //生成全局隊列
 6     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 7     
 8     
 9     /*! dispatch_apply函數說明
10      *
11      *  @brief  dispatch_apply函數是dispatch_sync函數和Dispatch Group的關聯API
12      *         該函數按指定的次數將指定的Block追加到指定的Dispatch Queue中,並等到全部的處理執行結束
13      *
14      *  @param 10    指定重復次數  指定10次
15      *  @param queue 追加對象的Dispatch Queue
16      *  @param index 帶有參數的Block, index的作用是為了按執行的順序區分各個Block
17      *
18      */
19     dispatch_apply(10, queue, ^(size_t index) {
20         NSLog(@"%zu", index);
21     });
22     NSLog(@"done");
23     
24     /*!
25      *  @brief  輸出結果
26      *
27      2016-02-25 19:24:39.102 dispatch_apply測試[2985:165004] 0
28      2016-02-25 19:24:39.102 dispatch_apply測試[2985:165086] 1
29      2016-02-25 19:24:39.104 dispatch_apply測試[2985:165004] 4
30      2016-02-25 19:24:39.104 dispatch_apply測試[2985:165004] 5
31      2016-02-25 19:24:39.104 dispatch_apply測試[2985:165004] 6
32      2016-02-25 19:24:39.103 dispatch_apply測試[2985:165088] 3
33      2016-02-25 19:24:39.104 dispatch_apply測試[2985:165004] 7
34      2016-02-25 19:24:39.105 dispatch_apply測試[2985:165004] 8
35      2016-02-25 19:24:39.105 dispatch_apply測試[2985:165004] 9
36      2016-02-25 19:24:39.102 dispatch_apply測試[2985:165087] 2
37      2016-02-25 19:24:39.105 dispatch_apply測試[2985:165004] done
38      *  !!!因為在Global Dispatch Queue中執行,所以各個處理的執行時間不定
39      但done一定會輸出在最后的位置,因為dispatch_apply函數會等待所以的處理結束
40      */
41 }

 

(二)dispatch_apply的使用技巧:模擬for循環

 1 /*!
 2  *  @brief  實例:當要對NSArray類對象的所有元素執行處理時,不必一個一個的編寫for循環部分
 3  */
 4 - (void)dispatchApplyTest2 {
 5     //1.創建NSArray類對象
 6     NSArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j"];
 7     
 8     //2.創建一個全局隊列
 9     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
10     
11     //3.通過dispatch_apply函數對NSArray中的全部元素進行處理,並等待處理完成,
12     dispatch_apply([array count], queue, ^(size_t index) {
13         NSLog(@"%zu: %@", index, [array objectAtIndex:index]);
14     });
15     NSLog(@"done");
16     /*!
17      *  @brief  輸出結果
18      *
19      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167871] 0: a
20      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167956] 1: b
21      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167957] 3: d
22      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167871] 4: e
23      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167957] 6: g
24      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167871] 7: h
25      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167957] 8: i
26      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167871] 9: j
27      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167956] 5: f
28      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167955] 2: c
29      *  !!!因為在Global Dispatch Queue中執行,所以各個處理的執行時間不定
30         但done一定會輸出在最后的位置,因為dispatch_apply函數會等待所以的處理結束
31      */
32 }

(三)在dispatch_async函數中異步執行dispatch_apply函數,模擬dispatch_sync的同步效果

 1 /*!
 2  *  @brief  推薦在dispatch_async函數中異步執行dispatch_apply函數
 3     效果     dispatch_apply函數與dispatch_sync函數形同,會等待處理執行結束
 4  */
 5 - (void)dispatchApplyTest3 {
 6     NSArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j"];
 7     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 8     
 9     dispatch_async(queue, ^{
10         
11         dispatch_apply([array count], queue, ^(size_t index) {
12             NSLog(@"%zu: %@", index, [array objectAtIndex:index]);
13         });
14         
15         dispatch_async(dispatch_get_main_queue(), ^{
16             NSLog(@"回到主線程執行用戶界面更新等操作");
17         });
18         
19     });
20     /*!
21      *  @brief  執行結果
22      *
23      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171856] 3: d
24      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171852] 1: b
25      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171853] 2: c
26      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171850] 0: a
27      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171856] 4: e
28      2016-02-25 19:49:53.189 dispatch_apply測試[3060:171852] 5: f
29      2016-02-25 19:49:53.190 dispatch_apply測試[3060:171853] 6: g
30      2016-02-25 19:49:53.190 dispatch_apply測試[3060:171850] 7: h
31      2016-02-25 19:49:53.190 dispatch_apply測試[3060:171852] 9: j
32      2016-02-25 19:49:53.190 dispatch_apply測試[3060:171856] 8: i
33      2016-02-25 19:49:53.218 dispatch_apply測試[3060:171760] 回到主線程執行用戶界面更新等操作
34      *
35      */
36 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM