作用:
dispatch_apply函數(shù)是dispatch_sync函數(shù)和Dispatch Group的關(guān)聯(lián)API
該函數(shù)按指定的次數(shù)將指定的Block追加到指定的Dispatch Queue中,并等到全部的處理執(zhí)行結(jié)束
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu", index);
});
NSLog(@"done");
打印結(jié)果
2016-08-20 20:58:24.493 GCDDemo[8434:1001513] 0
2016-08-20 20:58:24.493 GCDDemo[8434:1001579] 1
2016-08-20 20:58:24.493 GCDDemo[8434:1001554] 2
2016-08-20 20:58:24.494 GCDDemo[8434:1001513] 4
2016-08-20 20:58:24.493 GCDDemo[8434:1001556] 3
2016-08-20 20:58:24.494 GCDDemo[8434:1001579] 5
2016-08-20 20:58:24.589 GCDDemo[8434:1001513] 7
2016-08-20 20:58:24.589 GCDDemo[8434:1001556] 8
2016-08-20 20:58:24.589 GCDDemo[8434:1001554] 6
2016-08-20 20:58:24.589 GCDDemo[8434:1001579] 9
2016-08-20 20:58:24.589 GCDDemo[8434:1001513] done
因為在Global Dispatch Queue中執(zhí)行,所以各個處理的執(zhí)行時間不定
39 但done一定會輸出在最后的位置,因為dispatch_apply函數(shù)會等待所以的處理結(jié)束(dispatch_sync函數(shù)阻塞住當前線程);
參數(shù)
第一個參數(shù)為重復次數(shù),第二個參數(shù)為追加對象的Dispatch Queue,第三個參數(shù)為追加的處理催训。第三個參數(shù)的Block帶有參數(shù)科汗,是為了按第一個參數(shù)重復追加Block并區(qū)分各個Block而使用。
使用技巧 模擬for循環(huán):
NSArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply([array count], queue, ^(size_t index) {
NSLog(@"%zu: %@", index, [array objectAtIndex:index]);
});
NSLog(@"done");
打印結(jié)果:
2016-08-20 20:55:05.029 GCDDemo[8410:997281] 0: a
2016-08-20 20:55:05.029 GCDDemo[8410:997341] 1: b
2016-08-20 20:55:05.029 GCDDemo[8410:997342] 2: c
2016-08-20 20:55:05.029 GCDDemo[8410:997344] 3: d
2016-08-20 20:55:05.029 GCDDemo[8410:997281] 4: e
2016-08-20 20:55:05.029 GCDDemo[8410:997341] 5: f
2016-08-20 20:55:05.030 GCDDemo[8410:997342] 6: g
2016-08-20 20:55:05.030 GCDDemo[8410:997344] 7: h
2016-08-20 20:55:05.030 GCDDemo[8410:997281] 8: i
2016-08-20 20:55:05.030 GCDDemo[8410:997341] 9: j
2016-08-20 20:55:05.030 GCDDemo[8410:997281] done
優(yōu)化:
在dispatch_async函數(shù)中異步執(zhí)行dispatch_apply函數(shù),這樣不會阻塞住當前線程
代碼:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// 在全局并發(fā)隊列中等待dispatch_apply函數(shù)中全部處理執(zhí)行結(jié)束
dispatch_apply(10, queue, ^(size_t index) {
// 并列執(zhí)行相關(guān)處理
NSLog(@"%zu", index);
});
// dispatch_apply函數(shù)中的處理全部執(zhí)行結(jié)束
dispatch_async(dispatch_get_main_queue(), ^{
// 主線程中處理用戶界面更新等操作
});
NSLog(@"done");
});