美文网首页
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分钟就是绝对时间。

完,写的不好,欢迎纠错

相关文章

  • dispatch_after

    dispatch_after属于GCD,能够实现延迟执行的语法,或者说是GCD中延迟执行的函数。使用dispatc...

  • JSPatch 学习二 -- 基础用法(3)

    8. GCD 使用 dispatch_after() ;dispatch_async_main() ;dispat...

  • GCD中dispatch_after的使用

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

  • GCD中的dispatch_after使用说明

    dispatch_after解说 dispatch_after是来延迟执行的GCD方法,因为在主线程中我们不能用s...

  • GCD简单使用

    基础使用 GCD的延时执行方法 dispatch_after GCD的一次性代码(只执行一次) dispatch_...

  • iOS dispatch_after

    dispatch_after是来延迟执行的GCD方法,dispatch_after能让我们添加进队列的任务延时执行...

  • 线程篇之GCD

    本篇是是Objective-C 高级编程中多线程GCD部分 笔记. dispatch_after dispatch...

  • 多线程-理论

    多线程GCD---同步/异步 ,串行/并发 1.死锁 2.延时函数(dispatch_after) 3.使用dis...

  • GCD 总结(一)

    1.延时操作 GCD dispatch_after() 优点:写起来方便,直观 ...

  • 延迟调用方法总结

    延迟调用自己代理的方法: //GCD延迟dispatch_after(dispatch_time(DISPATCH...

网友评论

      本文标题:GCD中dispatch_after的使用

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