dispatch time.h

版本:iOS13.5

time.h

dispatch其他文件通道

索引

  • 创建一个相对于系统时钟的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_timedispatch_walltime的区别
dispatch_time创建的是相对于系统时钟的时间,当device进入休眠之后,系统的时钟也会进入休眠状态, 第一个函数计时就会暂停,当device唤醒后,才会重新开始计时,并且休眠前的计时无效。
dispatch_walltime创建的是一个绝对的时间,不会受device休眠的影响

你可能感兴趣的:(dispatch time.h)