美文网首页
GCD中dispatch_after的使用

GCD中dispatch_after的使用

作者: 邓布利多教授 | 来源:发表于2019-03-09 17:27 被阅读0次

    dispatch_after是GCD的一个延迟执行的方法,能让我们添加进队列的任务延时执行,该函数并不是在指定时间后执行任务,而只是在指定时间后添加任务到队列dispatch_queue里。

    创建延迟

    /*
    dispatch_time_t:时间参数
    dispatch_queue_t:队列
    dispatch_block_t:写入需要执行的操作
    */
    dispatch_after(dispatch_time_t when, dispatch_queue_t queue,
            dispatch_block_t block);
    

    特别注意:dispatch_time_t

    dispatch_time_t的函数结构是:dispatch_time(dispatch_time_t when, int64_t delta);
    其中第一个参数when直接用DISPATCH_TIME_NOW,表示当前时间
    第二个参数delta表示相对于第一个时间点上需要添加的纳秒数
    一般的写法是dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)

    整个方法的完整写法,正常的都是:

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    //表示延迟2秒后执行
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
            /*你的操作*/
        });
    

    delta参数说明

    /*系统提供的宏定义*/
    #define NSEC_PER_SEC 1000000000ull  每秒有1000000000纳秒
    #define NSEC_PER_MSEC 1000000ull    每毫秒有1000000纳秒
    #define USEC_PER_SEC 1000000ull     每秒有1000000微秒
    #define NSEC_PER_USEC 1000ull       每微秒有1000纳秒
    

    扩展奥,扩展!敲黑板了!bang、bang、bang!

    它有两种类型:dispatch_time和dispatch_walltime

    特别鸣谢:https://blog.csdn.net/wpeng20125/article/details/73650569
    本文的重点是摘自上面这位大神的文章
    在这里我用我的理解来解释一下dispatch_time和dispatch_walltime这俩东西

    1、首先是dispatch_time,这个我就不细说了,上面说的”一般””一般”的情况下说的都是这个,说下dispatch_walltime吧,这个的解释也是摘自上面那位大神的文章。

    2、dispatch_walltime,它的函数结构如下:
    dispatch_walltime(const struct timespec ※_Nullable when, int64_t delta)
    第一个参数const struct timespec是一个结构体
    第二个参数和dispatch_time的第二个参数意义是一样的

    3、dispatch_time创建的是相对时间,而dispatch_walltime创建的是绝对时间。什么叫相对时间和绝对时间呢?

    相对时间:dispatch_time函数的第二个参数(那个纳秒数)相对第一个时间点是相对的,(先说明一下,dispatch_time的第一个参数的开始时间参考的是当前系统的时间)打个比方说:第二个参数delta是个机器人(脑瓜里没有记忆芯片那种的),开发者是主人,第一个参数when是电源,当主人告诉机器人说:“如果电源有电流输入,1小时之内你要一直给我打扫卫生”。并且一直用喇叭在广播。好了,那么这个时候电源有电流输入,机器人就从门口开始打扫卫生,已经打扫了10分钟,这个时候电源电流输入中断了,机器人没有电流支持,进入了沉睡时间,过了1一分钟,电源又开始有电流输入了,这个时候机器人重新开机,它听到广播在说“如果电源有电流输入,1小时之内你要一直给我打扫卫生”,完全忘记了自己之前已经打扫了10分钟,然后就继续从门口开始打扫卫生,一直到1个小时的时间过完为止。这个1小时就是从电源开始有电流输入到打扫完卫生的相对时间。

    绝对时间:这个理解就简单了,你就理解成有一个傻子,他只知道要在10分钟之内把眼前的食物全部吃完,不管中途或者最后会发生啥样的结果,就是吃。这个10分钟就是绝对时间。

    完,写的不好,欢迎纠错

    相关文章

      网友评论

          本文标题:GCD中dispatch_after的使用

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