用负值计算“timeIntervalSinceNow”(CLLocation 示例)?
Posted
技术标签:
【中文标题】用负值计算“timeIntervalSinceNow”(CLLocation 示例)?【英文标题】:calculating 'timeIntervalSinceNow' with a negative value (CLLocation example)? 【发布时间】:2012-04-03 01:56:18 【问题描述】:我不明白文档中的这个例子:timeIntervalSinceNow
方法应该显示一个正值,但我们如何才能达到代码中提到的“5”? (我认为它或多或少是 0,或 -10、-20、-30 等......但我们怎样才能得到一个正值,比如 5?):
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
// test the age of the location measurement to determine if the measurement is cached
// in most cases you will not want to rely on cached measurements
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
if (locationAge > 5.0) return;
感谢您的帮助
【问题讨论】:
【参考方案1】:如果timeIntervalSinceNow
调用的结果是负数(意味着时间戳是过去的(在这种情况下,它总是如此)),它将被转换为正数。例如,-2.5
将变为 +2.5
(反之亦然)。
然后您测试倒置符号值,看看它是否大于 5.0——在这种情况下,这意味着时间戳来自超过 5 秒之前。如果是,则您无需对位置数据进行任何操作,因为它太旧而无法使用。
就个人而言,我会在没有符号反转的情况下写这个,在测试中使用负数:
if( [[newLocation timestamp] timeIntervalSinceNow] < -5.0 ) return;
【讨论】:
感谢 Iulius Cæsar,您将如何强制 cllocation 始终发送新位置而不是缓存位置? (不只是让应用程序在值被缓存的情况下什么都不做,而是告诉应用程序:“如果你有一个缓存的值,重新启动 cllocation”?) 你不能;它会尽快向您发送一个新的。你能做的就等着吧。 谢谢,我找不到默认缓存的时间?你知道吗? 定位硬件非常耗电,所以它只在请求时运行。当它关闭时,它会记录最后一个已知位置,因为没有理由不这样做。当它再次启动时,它拥有的第一个CLLocation
就是记录的值。找出它的年龄的唯一方法是检查它的时间戳。【参考方案2】:
这就是 NSDate 文档对 timeIntervalSinceNow 的看法:
接收者与当前日期和时间之间的间隔。如果接收者早于当前日期和时间,则返回值为负数。
在这种情况下,时间戳记录在过去,并且总是早于“现在”。另一方面,如果您使用 timeIntervalSince1970,结果将是肯定的。
【讨论】:
以上是关于用负值计算“timeIntervalSinceNow”(CLLocation 示例)?的主要内容,如果未能解决你的问题,请参考以下文章