通过Dispatch Group机制,根据系统资源状况来执行任务

dispatch group是GCD的一项特性,能够把任务分组。这组任务完成时,调用者会得到通知。

最重要的用途,把将要并发执行的多个任务合为一组。

把任务编组,有两种办法:

1、

dispatch_group_async(dispatch_group_t  _Nonnull group, dispatch_queue_t  _Nonnull queue, ^{
        
});

2、

dispatch_group_enter(dispatch_group_t  _Nonnull group);
dispatch_group_leave(dispatch_group_t  _Nonnull group);

用于等待dispatch group执行完毕的函数有两种:

1、

dispatch_group_wait(dispatch_group_t  _Nonnull group, dispatch_time_t timeout);

2、

dispatch_group_notify(dispatch_group_t  _Nonnull group, dispatch_queue_t  _Nonnull queue, ^
{

});

实际使用:

1、

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
for (NSNumber *n in ary)
{
    dispatch_group_async(dispatchGroup, queue, ^
    {
        int i = [n intValue];
        NSLog(@"输出:%d", i);
    });
}
dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER);
NSLog(@"结束了");

2、

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatchGroup = dispatch_group_create();
for (NSNumber *n in ary)
{
    dispatch_group_async(dispatchGroup, queue, ^
    {
        int i = [n intValue];
        NSLog(@"输出:%d", i);
    });
}
dispatch_queue_t notifyQueue = dispatch_get_main_queue();
dispatch_group_notify(dispatchGroup, notifyQueue, ^
{
    NSLog(@"结束了");
});

在不同的优先级线程中执行任务:

NSMutableArray *ary = [NSMutableArray array];
for (int i = 0; i < 100; i ++)
{
    NSNumber *n = [NSNumber numberWithInt:i];
    [ary addObject:n];
}

NSMutableArray *ary2 = [NSMutableArray array];
for (int i = 200; i < 300; i ++)
{
    NSNumber *n = [NSNumber numberWithInt:i];
    [ary2 addObject:n];
}

dispatch_queue_t lowPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

dispatch_group_t dispatchGroup = dispatch_group_create();

for (NSNumber *n in ary)
{
    dispatch_group_async(dispatchGroup, lowPriorityQueue, ^
    {
        int i = [n intValue];
        NSLog(@"低输出:%d", i);
    });
}

for (NSNumber *n in ary2)
{
    dispatch_group_async(dispatchGroup, highPriorityQueue, ^
    {
        int i = [n intValue];
        NSLog(@"高输出:%d", i);
    });
}

dispatch_queue_t notifyQueue = dispatch_get_main_queue();
dispatch_group_notify(dispatchGroup, notifyQueue, ^
{
    NSLog(@"结束了");
});

串行队列没有必要使用group,因为都是按照顺序执行的:

dispatch_queue_t queue = dispatch_queue_create("EOC1", NULL);
    
for (NSNumber *n in ary)
{
    dispatch_async(queue, ^
    {
        int i = [n intValue];
        NSLog(@"输出:%d", i);
    });
}
dispatch_async(queue, ^
{
    NSLog(@"结束");
});

由于GCD有并发队列机制,所以能够根据可用的系统资源状况来并发执行任务。

用GCD替代for循环:

dispatch_queue_t queue = dispatch_queue_create("EOC1", NULL);
    
dispatch_apply(ary.count, queue, ^(size_t i)
{
    int n = [ary[i] intValue];
    NSLog(@"输出:%d", n);
});

这样会等待执行完毕之后才能去执行之后的操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Win_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值