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 }