GCD的简单应用

1.耗时操作
通常我们需要做耗时操作的时,可以直接使用下面代码,GCD会自动帮我们创建线程进行处理

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //耗时操作
        NSLog(@"1");
        dispatch_async(dispatch_get_main_queue(), ^{
            //更新UI
            NSLog(@"2");
        });
    });

2.阻塞式(有先后顺序)操作
若遇到任务有先后顺序,可以考虑barrier,阻塞式
eg: 流程任务,需要多个网络请求的值进行汇总,再进行网络请求,再汇总。
下面的任务顺序就是 123顺序任意改变 接着永远是4444444 再 567顺序任意改变 最后永远是8888888

    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"444444");
            dispatch_async(queue, ^{
                NSLog(@"5");
            });
            dispatch_async(queue, ^{
                NSLog(@"6");
            });
            dispatch_async(queue, ^{
                NSLog(@"7");
            });
            dispatch_barrier_async(queue, ^{
                    NSLog(@"888888");
        });
    });

这样写也是可以的

    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"444444");

    });
    dispatch_async(queue, ^{
        NSLog(@"5");
    });
    dispatch_async(queue, ^{
        NSLog(@"6");
    });
    dispatch_async(queue, ^{
        NSLog(@"7");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"888888");
    });

3.1调度组:一组代码完成后统一做处理
dispatch_group_notify是异步的来监听group调度组中的人物完成情况,若所有人物完成则会调用notify中的任务,但是notify后面的任务还是会先执行,但后面的任务在代码中是主线程不是子线程

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t global = dispatch_get_global_queue(0, 0);
    
    dispatch_group_async(group, global, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务一:%@",[NSThread currentThread]);
        
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务二:%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务三:%@",[NSThread currentThread]);
    });
    
    dispatch_group_notify(group, global, ^{
        NSLog(@"一二三都完成");
    });
    
    NSLog(@"异步代码");

3.2调度组
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
是同步的等待,当调度组中的任务全部执行完毕的时候才会调用wait后面的语句,

    dispatch_group_t group = dispatch_group_create();
    
    dispatch_queue_t global = dispatch_get_global_queue(0, 0);
    
    dispatch_group_async(group, global, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务一:%@",[NSThread currentThread]);
        
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务二:%@",[NSThread currentThread]);
    });
    dispatch_group_async(group, global, ^{
        NSLog(@"任务三:%@",[NSThread currentThread]);
    });
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    NSLog(@"异步代码");

调度组总结:
wait可以理解为sync
notify可以理解为async

调度组还有对应的 enter leave方法 不过并不是很实用

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

相关阅读更多精彩内容

  • 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示。在第二部...
    透支未来阅读 401评论 0 1
  • 背景 担心了两周的我终于轮到去医院做胃镜检查了!去的时候我都想好了最坏的可能(胃癌),之前在网上查的症状都很相似。...
    Dely阅读 9,369评论 21 42
  • 1 GCD 术语 1.1 Serial vs. Concurrent 串行 vs. 并发 概念:该术语描述执行当前...
    NinthDay阅读 4,105评论 2 38
  • 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列...
    有梦想的老伯伯阅读 1,075评论 0 4
  • GCD笔记 总结一下多线程部分,最强大的无疑是GCD,那么先从这一块部分讲起. Dispatch Queue的种类...
    jins_1990阅读 824评论 0 1

友情链接更多精彩内容