iOS 多线程GCD队列组的基本使用

假设有一个页面有多个下载文件的需求,这个时候如果要执行多个下载文件的任务,这些耗时的任务会被放到多个线程上异步执行,直到全部的文件下载完成,弹出一个提示框来通知用户文件已下载完成。这个时候就需要用到我们的队列组的功能.

下面开始描述队列组的基本的使用.

1.创建一个队列组

dispatch_group_t fGroup = dispatch_group_create();

2.创建队列并添加任务.

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(fGroup, queue, ^{
for (int i = 0; i<5; i++) {
NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
}
});

3.添加通知的处理(所有的任务都执行完成后的回调.)

dispatch_group_notify(fGroup, queue, ^{
NSLog(@"都执行完啦");
});

上述代码整合如下

    NSLog(@"开始了");
    dispatch_group_t fGroup = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_group_async(fGroup, queue, ^{
        for (int i = 0; i<5; i++) {
            NSLog(@"1111-%d --- %@", i, [NSThread currentThread]);
        }
        for (int i = 0; i<5; i++) {
            NSLog(@"2222-%d --- %@", i, [NSThread currentThread]);
        }
    });
    
    dispatch_group_async(fGroup, queue, ^{
        for (int i = 0; i<5; i++) {
            NSLog(@"3333-%d --- %@", i, [NSThread currentThread]);
        }
        for (int i = 0; i<5; i++) {
            NSLog(@"4444-%d --- %@", i, [NSThread currentThread]);
        }
    });
    
    dispatch_group_notify(fGroup, queue, ^{
        // 所有的任务都执行完成后的回调.
        NSLog(@"都执行完啦");
    });
    NSLog(@"结束了");

注意: 以上代码中 任务,有局限性,并不能解决实际开发中的网络请求任务.因为我们发起了网络请求,上面的任务block就会认为任务执行完成了,然而实际开发中,只要网络请求回调成功了才能确认为 任务执行完成.所有以上代码需要修改.

队列组修改完善版.

    NSLog(@"开始了");
    dispatch_group_t fGroup = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_enter(fGroup);
    dispatch_group_async(fGroup, queue, ^{
        // 发起网络请求
        // 成功或者失败都掉用这个方法.
        dispatch_group_leave(fGroup);
    });
    
    dispatch_group_enter(fGroup);
    dispatch_group_async(fGroup, queue, ^{
        // 发起网络请求
        // 成功或者失败都掉用这个方法.
        dispatch_group_leave(fGroup);
    });
    
    dispatch_group_notify(fGroup, queue, ^{
        // 所有的任务都执行完成后的回调.
        NSLog(@"都执行完啦");
    });
    NSLog(@"结束了");

注: dispatch_group_enter与dispatch_group_leave是成对出现的, 只要所有的enter 都调用了 leave, 才会调用notify

本项目源码: GCD演示Demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容