GCD调度组实现原理

手动实现调度组

- (void)groupDemo
{
    // 调度组
    dispatch_group_t group = dispatch_group_create();
    // 队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 下载图片A
    // 1.进入调度组 : 给任务做标记
    dispatch_group_enter(group);
    // 2.让调度组里面的任务异步执行
    dispatch_async(queue, ^{
        NSLog(@"下载图片A %@",[NSThread currentThread]);

        // 3.移出调度组 : 把标记从调度组移出
        dispatch_group_leave(group);
    });

    // 下载图片B
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        NSLog(@"下载图片B %@",[NSThread currentThread]);

        dispatch_group_leave(group);
    });

    // 下载图片C
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        NSLog(@"下载图片C %@",[NSThread currentThread]);

        dispatch_group_leave(group);
    });

    // 监听一组异步任务是否执行结束
    dispatch_group_notify(group, queue, ^{
        NSLog(@"三张图片下载完了 %@",[NSThread currentThread]);
    });
}

使用GCD调度组监听一组异步任务是否完成

// 使用调度组下载图片 : 演示调度组不是用来解决线程安全问题的 
- (void)groupDemo
{
    // 调度组
    dispatch_group_t group = dispatch_group_create();
    // 队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 循环的使用调度组去异步的下载图片
    for (NSInteger i = 0; i < 1000; i++) {

        // 调度组异步执行的函数 : 会把每个任务都在group里面做一个标记
        dispatch_group_async(group, queue, ^{

            // 获取本地图片的全路径
            NSString *name = [NSString stringWithFormat:@"%02zd",(i%10)+1];
            NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
            // 获取图片
            UIImage *image = [UIImage imageWithContentsOfFile:filePath];

            NSLog(@"%@ %@",name,[NSThread currentThread]);

            // 图片下载完成之后,需要缓存到沙盒,如果监听到这组异步任务执行结束,就在`dispatch_group_notify`方法里面,刷新UI
        });
    }

    // 一旦一组异步任务执行结束之后,可以得到统一的通知,这个函数默认在子线程执行的
    // 这个方法不会循环多次的调用,只会执行一次
    dispatch_group_notify(group, queue, ^{

        // 一组异步任务执行结束之后的操作,写在这个代码块里面,一般是刷新UI的,需要回到主线程
        NSLog(@"1000张图片执行完了? %@",[NSThread currentThread]);
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zok93

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

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

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

打赏作者

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

抵扣说明:

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

余额充值