iOS开发-dispatch_time_t

百里泓
2023-12-01

dispatch_time_t 的定义:

typedef uint64_t dispatch_time_t;

/**
描述:时间的抽象表示;
DISPATCH_TIME_NOW(0)表示“现在”
DISPATCH_TIME_FOREVER(~0)表示“无穷大”
两者之间的每个值都是不透明的编码。 
*/

 dispatch_time_t 的创建:

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        //微妙 转 纳秒
 类似资料: