GCD-dispatch_apply

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值