函数原型:void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t));
此函数是异步遍历函数,异步遍历 block 。但是函数本身是同步函数,会阻塞当前线程的执行,直至遍历结束,当前线程继续执行。
如果参数传入一个并行队列,遍历是并行的,遍历的 index 顺序是不确定的,并且每个遍历所在的线程也是不确定的。
如果参数传入一个串行队列,我没有找到可靠的说法,单遍历应该是是串行的,并且遍历都在一个线程。但是平时估计不会这么用。
示例:
- (IBAction)GCD_dispatch_apply_buttonAction:(UIButton *)sender {
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("queueIdentifier2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(dispatch_get_global_queue(0, 0), ^(){
//此处遍历顺序是不确定的,也就是说index不一定会按顺序输出,同时遍历的线程也是不确定的。
//此函数是同步函数,会阻塞当前线程运行。需要手动根据需要来决定是否在非主线程执行。
dispatch_apply(5, queue, ^(size_t index) {
NSLog(@"threat:%@---index:%zu",[NSThread currentThread],index);
});
//当循环完成后才执行后续任务
NSLog(@"循环完成");
});
}
输出:
循环完成
一定是最后输出的,因为 dispatch_apply
是同步函数,它会阻塞当前线程的运行。
threat:{number = 3, name = (null)}—index:0
threat:{number = 3, name = (null)}—index:1
threat:{number = 3, name = (null)}—index:2
threat:{number = 3, name = (null)}—index:3
threat:{number = 3, name = (null)}—index:4
循环完成