美文网首页iOS常用
GCD中dispatch_sync, dispatch_asyn

GCD中dispatch_sync, dispatch_asyn

作者: ShawnAlex | 来源:发表于2020-07-28 17:23 被阅读0次

    今天记录一下 GCD中
    dispatch_sync
    dispatch_async
    dispatch_after
    dispatch_once
    dispatch_group

    如果你想知道他们是什么? 既然你诚心诚意的发问了, 我就大发慈悲的告诉你!

    首先我们先了解几个概念

    队列
    队列分串行并行,

    串行 就是任务需要按照一定顺序执行, 例如 J, Q, K, A 四个事件, 按照顺序执行, 后面的需要等待前面的任务完成才能执行, 所以结束顺序是JQKA

    并行 就是任务之间互相不干涉, 同时执行, 例如 J, Q, K, A 四个事件, 同时执行, 无等待, 所以结束顺序是随机的

    dispatch_sync (同步执行): 使用 dispatch_sync 调用一个block, 这个block放在指定的queue1上执行, 但会等到block执行完毕才返回, 期间阻塞当前调用的 dispatch_sync 或 dispatch_async代码的queue, 直到 sync 函数返回。

    dispatch_async (异步执行): 使用 dispatch_async 调用一个block, 这个block放在指定的queue2队尾等待执行, 至于这个block是被并行还是串行执行,只和dispatch_async中的指定的queue_1有关,但是dispatch_async会马上返回。用于对某个线程进行异步操作, 异步操作可以让我们不阻塞线程的情况下, 充分利用不同线程和队列来处理任务。

    举一个生动的例子:

    dispatch_sync (同步) 就相当于给客服打电话, 客服说稍等请不要挂断, 然后处理你的问题, 这期间你不能再打其他电话, 直到你这边问题处理完挂断, 你才可以继续给别人打电话

    dispatch_async (异步) 就相当于给客服打电话, 客服说已收到你的问题, 先挂断, 之后返打给你, 然后你这边问题就可以处理其他电话, 等着客服返回打给你就可以

        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"1");
        });
        NSLog(@"2");
        
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    
    打印结果: 
    1  2  3  4
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"1");
        });
        NSLog(@"2");
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    
    每次可能都不一样, 具体看异步返回速度, 不过 2肯定在4 前面
    打印结果:
    2  1  4  3
    或
    2  4  1  3
    或
    ....
     
    

    可以看出,
    dispatch_sync 等待block执行完毕后才接着执行后面的代码
    dispatch_async 不需等待block执行完毕, 立即执行后面的代码

    接下来我们看一种特殊情况
    在主线程中调用

        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"1");
        });
    

    相关文章

      网友评论

        本文标题:GCD中dispatch_sync, dispatch_asyn

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