GCD-dispatch_apply

来源:互联网 发布:电脑能看淘宝直播吗 编辑:程序博客网 时间:2024/05/05 04:08

函数原型: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
循环完成

0 0
原创粉丝点击