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 的区别的主要内容,如果未能解决你的问题,请参考以下文章

iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

SpringMVC总结

GCD 开发

guava eventbus代码分析

iOS -- 单例类

《springMVC》学习笔记