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分钟就是绝对时间。
网友评论