在 iOS (objective-C) 中将 mach_absolute_time 转换为(纳)秒
Converting mach_absolute_time to (nano)seconds in iOS (objective-C)
我正在尝试在 iOS 中编写一个辅助方法,以允许我使用 mach_absolute_time()
秒(或纳秒),以便我可以找到时间导数传入的设备传感器数据。这是我的尝试:
#include <mach/mach_time.h>
- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
mach_timebase_info_data_t _clock_timebase;
double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
return nanos / 10e9;
}
上面的代码正在编译,但我收到的当前警告是 'right operand of '*' 是垃圾值'。另外,它在任何情况下都不会返回合理的结果:/
根据我的阅读,mach_absolute_time()
有一些特点,所以我认为让这个工作可能对其他人有用。
所有的帮助我们都欣然接受。谢谢
//// 编辑 ////
感谢 Rob Napier 的超级快速回答,这里是包含初始化的方法:
#include <mach/mach_time.h>
- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
return nanos / 10e9;
}
您已声明 _clock_timebase
,但您从未对其进行初始化,因此它只是在堆栈中填充了垃圾值。你的意思是:
mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
...
您可能会发现使用 AbsoluteToNanoseconds
为您做这件事更方便。有关完整示例,请参阅 QA1398: Mach Absolute Time Units。
请注意 mach_timebase_info is promised to be stable,因此您可以根据需要将其初始化一次。 (如果它不稳定,用现有的API检查它就不可能避免竞争条件,那真是太好了....)
我正在尝试在 iOS 中编写一个辅助方法,以允许我使用 mach_absolute_time()
秒(或纳秒),以便我可以找到时间导数传入的设备传感器数据。这是我的尝试:
#include <mach/mach_time.h>
- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
mach_timebase_info_data_t _clock_timebase;
double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
return nanos / 10e9;
}
上面的代码正在编译,但我收到的当前警告是 'right operand of '*' 是垃圾值'。另外,它在任何情况下都不会返回合理的结果:/
根据我的阅读,mach_absolute_time()
有一些特点,所以我认为让这个工作可能对其他人有用。
所有的帮助我们都欣然接受。谢谢
//// 编辑 ////
感谢 Rob Napier 的超级快速回答,这里是包含初始化的方法:
#include <mach/mach_time.h>
- (double) convertMachAbsoluteTimeIntoSeconds:(uint64_t) mach_time {
mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
double nanos = (mach_time * _clock_timebase.numer) / _clock_timebase.denom;
return nanos / 10e9;
}
您已声明 _clock_timebase
,但您从未对其进行初始化,因此它只是在堆栈中填充了垃圾值。你的意思是:
mach_timebase_info_data_t _clock_timebase;
mach_timebase_info(&_clock_timebase); // Initialize timebase_info
...
您可能会发现使用 AbsoluteToNanoseconds
为您做这件事更方便。有关完整示例,请参阅 QA1398: Mach Absolute Time Units。
请注意 mach_timebase_info is promised to be stable,因此您可以根据需要将其初始化一次。 (如果它不稳定,用现有的API检查它就不可能避免竞争条件,那真是太好了....)