dispatch_walltime与dispatch_time_t 的区别
Posted Jsen_Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dispatch_walltime与dispatch_time_t 的区别相关的知识,希望对你有一定的参考价值。
dispatch_walltime的官方文档解释如下
Function
dispatch_walltime
// 根据系统时钟,创建一个绝对时间
Creates a dispatch_time_t using an absolute time according to the wall clock.
Declaration
dispatch_time_t dispatch_walltime(const struct timespec *when, int64_t delta);
Parameters
when
// 一个时间结构体,如果传入NULL,方法会默认使用当前时间
A struct timespec to add time to. If NULL is passed, then this function uses the result of gettimeofday.
delta
// 纳秒
Nanoseconds to add.
Return Value
A new dispatch_time_t.
Discussion
// 基于gettimeofday的绝对时间
The wall clock is based on gettimeofday(:😃.
Time Constructs
-
dispatch_time
Creates a dispatch_time_t relative to the default clock or modifies an existing dispatch_time_t. -
dispatch_time_t
An abstract representation of time. -
DISPATCH_WALLTIME_NOW
The current time.
我们可以看出dispatch_walltime生成的是根据系统时钟的绝对时间,
第一个参数可以为NULL,这样默认为当前时间
第二个参数的单位为纳秒
整个API的调用如下
// 当前时间1秒后的时间
dispatch_time_t time_t = dispatch_walltime(NULL, 1000 * 1000 * 1000);
我们再来看一下我们常见的dispatch_time_t的创建方式:
dispatch_time_t time_t2 = dispatch_time(DISPATCH_TIME_NOW, 1000 * 1000 * 1000);
表面上看没有什么不同,普通的使用也不会出现什么区别.
但是dispatch_walltime的定义为绝对时间,所谓绝对时间,就是不收到系统休眠等因素的影响,打比方说
我们使用dispatch_walltime创建一个time1,使用dispatch_time创建一个time2 ,两个时间都是1个小时后的时间(12:15).我们用其创建两个定时器,对应事件后出发一个事件.
- 如果系统和程序正常运行,在不考虑runloop的情况下,两个事件会如期同时出发.
- 程序开始后,我们改变系统事件为13:00,再进入程序,这时time1对应的事件会立即触发.
也就是说,dispatch_time是相对的计数时钟,而dispatch_walltime是绝对的系统时钟
以上是关于dispatch_walltime与dispatch_time_t 的区别的主要内容,如果未能解决你的问题,请参考以下文章