版本:iOS13.5
time.h
索引
- 创建一个相对于系统时钟的dispatch_time_t(相对时间)
dispatch_time
- 创建一个相对于gettimeofday(3)的dispatch_time_t(绝对时间)
dispatch_walltime
详解
- 创建一个相对于系统时钟的dispatch_time_t(相对时间)
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
when 当前值
若为DISPATCH_TIME_NOW
则将使用默认时钟,表示现在
若为DISPATCH_TIME_FOREVER
则将使用默认时钟,表示永远
若为DISPATCH_WALLTIME_NOW
则使用gettimeofday(3)返回的值
dispatch_time(DISPATCH_WALLTIME_NOW,delta)
等同于dispatch_walltime(NULL,delta)
delta 偏移的时间(纳秒)
#define NSEC_PER_SEC 1000000000ull//秒
#define NSEC_PER_MSEC 1000000ull //毫秒
#define USEC_PER_SEC 1000000ull //毫秒
#define NSEC_PER_USEC 1000ull //微秒
例:
//表示创建一个3秒后的时间
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
//表示创建一个相对于time5秒后的时间 也就是8秒后
dispatch_time_t time1 = dispatch_time(time, 5 * NSEC_PER_SEC);
dispatch_after(time1, dispatch_get_main_queue(), ^{
});
- 创建一个相对于gettimeofday(3)的dispatch_time_t(绝对时间)
dispatch_time_t dispatch_walltime(const struct timespec *_Nullable when, int64_t delta);
when 要添加时间的struct timespec 是个结构体
_STRUCT_TIMESPEC
{
__darwin_time_t tv_sec; //秒
long tv_nsec; //纳秒
};
如果传入NULL 相当于dispatch_time(DISPATCH_WALLTIME_NOW, delta)
delta 偏移的时间(纳秒)
例:
//距离现在2秒后的时间戳
NSTimeInterval interval = [[NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]] timeIntervalSince1970];
//interval的整数部分
double second;
//interval的小数部分
double subsecond;
//interval分解为整数和小数
subsecond = modf(interval, &second);
struct timespec timespec;
timespec.tv_sec = second;
timespec.tv_nsec = subsecond * NSEC_PER_SEC;
//相于对timespec的3秒后 即为现在5秒后
dispatch_time_t time2 = dispatch_walltime(×pec, 3 * NSEC_PER_SEC);
dispatch_after(time2, dispatch_get_main_queue(), ^{
});
dispatch_time
和dispatch_walltime
的区别
dispatch_time
创建的是相对于系统时钟的时间,当device进入休眠之后,系统的时钟也会进入休眠状态, 第一个函数计时就会暂停,当device唤醒后,才会重新开始计时,并且休眠前的计时无效。
dispatch_walltime
创建的是一个绝对的时间,不会受device休眠的影响
网友评论