usr/include/dispatch - time.h
#include <dispatch.h>
macros:
#define NSEC_PER_SEC 1000000000ull
#define NSEC_PER_MSEC 1000000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_USEC 1000ull
#define DISPATCH_TIME_NOW (0ull)
#define DISPATCH_TIME_FOREVER (~0ull)
API
/*!
* @abstract
* 根据默认时钟或者调整一个存在的dispatch_time_t来创建一个dispatch_time_t
*
* @discussion
* 在Mac OS X 默认的时钟是基于 mach_absolute_time().
*
* @param when
* 可选择项,参数为dispatch_time_t这样纳秒,如果输入为零,dispatch_time()这个API将会使用mach_absolute_time()的结果
*
* @param delta
* 延迟秒数,单位纳秒
*
* @result
* 返回新的dispatch_time_t
*/
dispatch_time_t
dispatch_time(dispatch_time_t when, int64_t delta);
/*!
* @abstract
* 使用“挂钟”创建dispatch_time_t
*
* @discussion
* 在Mac OS X 默认的时钟是基于 gettimeofday(3).
*
* @param when
* 结构体timespec,如果输入NULL,dispatch_walltime()这个API将会使用gettimeofday(3)的结果
*
* @param delta
* 延迟秒数,单位纳秒
*
* @result
* 返回新的dispatch_time_t
*/
dispatch_time_t
dispatch_walltime(const struct timespec *when, int64_t delta);
mach_absolute_time##
mach_absolute_time()在Linux下不受修改系统时间影响而且能够接近毫秒级别的API
mach_absolute_time是一个CPU/总线依赖函数,返回一个机遇系统启动后的时钟的计数,在Mac OS X上的它包含时钟内部的所有时间区域。对于测试,它是一个很有用的API。
1.获取mach_absolute_time###
#include <mach/mach_time.h>
uint64_t start = mach_absolute_time();
uint64_t stop = mach_absolute_time();
2.把mach_absolute_time时间差转化为秒数
double_t subtrackTimes(uint64_t endTime, uint64_t startTime)
{
uint64_t difference = endTime - startTime;
static double conversion = 0.0;
if (conversion == 0.0) {
mach_timebase_info_data_t info;
kern_return_t err = mach_timebase_info(&info);
if (err == 0) {
conversion = 1e-9 * (double)info.numer/(double)info.denom;
}
return conversion * (double)difference;
}
return 0.0;
}
dispatch_walltime##
dispatch_walltime函数是以一个timesepc结构体类型的时间结构创建的一个dispatch_time_t类型的时间,我看很多博客都解释他是创建绝对时间,例如:何年何月何日几点几分几秒这样的时间点,但是根据爱因斯坦他们对这个东西的模糊定义,我觉得dispatch_walltime更应该被称为时间点。
1.根据NSDate创建dispatch_time_t对象###
自定义函数:
dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
NSTimeInterval interval;
double second, subsecond;
struct timespec time;
dispatch_time_t walltime;
interval = [date timeIntervalSince1970];
subsecond = modf(interval, &second);
time.tv_sec = second;
time.tv_nsec = subsecond * NSEC_PER_SEC;
walltime = dispatch_walltime(&time, 0);
return walltime;
}
演示代码:
getDispatchTimeByDate([NSDate dateWithTimeIntervalSinceNow:3]

浙公网安备 33010602011771号