美文网首页
GCD的简单应用

GCD的简单应用

作者: ___1o_8o | 来源:发表于2016-08-10 23:55 被阅读4次

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方法 不过并不是很实用

相关文章

  • GCD的简单应用

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

  • GCD的简单应用

    导语: 每次提到多线程,iOS骚年总是说GCD(感觉有点高逼格)。当然,做的项目自然会接触到GCD,功能是挺强大的...

  • GCD 的简单应用 Swift

    获取 GCD 的 queue 的引用,GCD 不是基于面向对象,还是基于 Function。 拥有了 queue,...

  • 13 个 GCD 应用场景

    13 个 GCD 应用场景 13 个 GCD 应用场景

  • 源码剖析:探究 Repeat 中 GCD 的应用

    源码剖析:探究 Repeat 中 GCD 的应用源码剖析:探究 Repeat 中 GCD 的应用

  • 【转载XMG】GCD的简单应用

  • GCD介绍

    一、GCD简单介绍 什么是GCD GCD优势 任务和队列 GCD有2个核心概念 GCD的使用就2个步骤 将任务添加...

  • iOS多线程,GCD的了解及实现

    什么是GCD,关于GCD的简单概念 其实多线程这个东西,GCD(Grand Central Dispatch),纯...

  • 多线程之GCD

    本文介绍什么是GCD 、 GCD的优势有哪些、GCD到底是什么?、 CGD的实际应用 下面开始详细解析 1.什么是...

  • iOS Objective-C GCD 应用篇

    iOS Objective-C GCD 应用篇 本文主要对GCD中的dispatch_semaphore(信号量)...

网友评论

      本文标题:GCD的简单应用

      本文链接:https://www.haomeiwen.com/subject/zrbjsttx.html