dispatch_time_t 类型,它的创建有两个函数
1. dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)
- 第一个参数是从什么时间开始,一般直接传
DISPATCH_TIME_NOW 表示从现在开始 - 第二个参数表示具体的时间长度(不能直接传 int 或 float), 可以写成这种形式 (int64_t)3* NSEC_PER_SEC
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC));
注意: delta 的单位是纳秒!
1秒的写作方式可以是 :
1* NSEC_PER_SEC;
1000* NSEC_PER_MSEC;
USEC_PER_SEC* NSEC_PER_USEC;
对用宏定义:
#define NSEC_PER_SEC 1000000000ull 每秒1000000000纳秒
#define NSEC_PER_MSEC 1000000ull 每毫秒1000000纳秒
#define USEC_PER_SEC 1000000ull 每秒1000000微妙
#define NSEC_PER_USEC 1000ull 每微妙1000纳秒
对应转化率:
英文缩写 | 英文全拼 | 中文含义 | 数学单位 |
---|---|---|---|
SEC | second | 秒 | s |
MSEC | millisecond | 毫秒 | ms |
USEC | microsecond | 微妙 | us |
NSEC | nanosecond | 纳秒 | ns |
2. dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>),
- 第一个参数是一个结构体, 创建的是一个绝对的时间点,比如 2016年10月10日8点30分30秒, 如果你不需要自某一个特定的时刻开始,可以传 NUll,表示自动获取当前时区的当前时间作为开始时刻
- 第二参数意义同第一个函数
dispatch_time_t time = dispatch_walltime(NULL, 5* NSEC_PER_SEC);
***重点: 两个函数的不同
例如:
从现在开始,1小时之后是触发某个事件
-
使用第一个函数创建的是一个相对的时间,第一个参数开始时间参考的是当前系统的时钟,当 device 进入休眠之后,系统的时钟也会进入休眠状态, 第一个函数同样被挂起; 假如 device 在第一个函数开始执行后10分钟进入了休眠状态,那么这个函数同时也会停止执行,当你再次唤醒 device 之后,该函数同时被唤醒,但是事件的触发就变成了从唤醒 device 的时刻开始,1小时之后.
-
而第二个函数则不同,他创建的是一个绝对的时间点,一旦创建就表示从这个时间点开始,1小时之后触发事件,假如 device 休眠了10分钟,当再次唤醒 device 的时候,计算时间间隔的时间起点还是,开始时就设置的那个时间点, 而不会受到 device 是否进入休眠影响