dispatch_apply,作用是把指定次数的block添加到queue中,第一个参数是迭代次数,第二个是所在队列,一般为全局队列、 第三个是当前索引。
dispatch_apply 是同步函数,会阻塞当前线程知道所有的循环迭代完成,当提交到并发queue是,循环迭代的顺序是不确定的。
dispatch_apply(10, queue, ^(size_t index) { 20 NSLog(@"%zu", index); 21 }); 22 NSLog(@"done");
输出结果随机
用dispatch_apply模拟for循环
6 NSArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j"];
9 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply([array count], queue, ^(size_t index) { 13 NSLog(@"%zu: %@", index, [array objectAtIndex:index]); 14 }); 15 NSLog(@"done");
输出结果:
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函数会等待所以的处理结束