typedef uint64_t dispatch_time_t;
/**
描述:时间的抽象表示;
DISPATCH_TIME_NOW(0)表示“现在”
DISPATCH_TIME_FOREVER(~0)表示“无穷大”
两者之间的每个值都是不透明的编码。
*/
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
第一个参数 when,表示从何时开始,一般直接传 DISPATCH_TIME_NOW。
第二个参数 delta,表示具体的时间长度,单位是纳秒,该参数不能直接传 int 或 float,并且需要将秒转为纳秒,需要写成这种格式:(int64_t) 1 * NSEC_PER_SEC,表示1秒。
dispatch_time_t dispatch_walltime(const struct timespec *_Nullable when, int64_t delta);
第一个参数 when 与上面不同,是 timespec 结构体,创建的是一个绝对的时间点,可以传入 NULL 表示从现在开始,也可以根据 NSDate 日期确定一个特定的时间点。
第二个参数 delta 同上。
dispatch_time() 创建相对时间,基于 mach_absolute_time() 和 CPU 的时钟周期数 ticks,ticks 在每次手机重启之后才会重新开始计数,也就是 iPhone 锁屏进入休眠之后 ticks 会暂停计数,mach_absolute_time() 不会受系统时间影响,只受设备重启和休眠行为影响。
dispatch_walltime() 创建绝对准确时间,当设备休眠时,时间不受影响。
dispatch_time_t sst_dispatch_time_now_after_seconds(long second) {
int64_t delta = second * NSEC_PER_SEC;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delta);
return time;
}
dispatch_time_t sst_dispatch_walltime_now_after_seconds(long second) {
int64_t delta = second * NSEC_PER_SEC;
dispatch_time_t time = dispatch_walltime(NULL, delta);
return time;
}
dispatch_time_t sst_dispatch_walltime_from_date_after_seconds(NSDate *date, long after) {
NSTimeInterval interval = [date timeIntervalSince1970];
double second, nanosecond;
nanosecond = modf(interval, &second);
struct timespec time;
time.tv_sec = second;
time.tv_nsec = nanosecond * NSEC_PER_SEC;
int64_t delta = after * NSEC_PER_SEC;
dispatch_time_t milestone = dispatch_walltime(&time, delta);
return milestone;
}
"ull"是C语言的数值字面量,是显示表明类型时使用的字符串,表示类型为<unsigned long long>。
#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)
DISPATCH_TIME_NOW(0ull)表示“现在”,DISPATCH_TIME_FOREVER(~0ull)表示“无穷大”。
时间单位的转化:
#define NSEC_PER_SEC 1000000000ull //秒 转 纳秒、最常用
#define NSEC_PER_MSEC 1000000ull //毫秒 转 纳秒
#define USEC_PER_SEC 1000000ull //秒 转 微秒
#define NSEC_PER_USEC 1000ull //微妙 转 纳秒