【问题标题】:calculating 'timeIntervalSinceNow' with a negative value (CLLocation example)?用负值计算“timeIntervalSinceNow”(CLLocation 示例)?
【发布时间】: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;

感谢您的帮助

【问题讨论】:

    标签: objective-c cllocation nstimeinterval


    【解决方案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,结果将是肯定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2014-08-15
      相关资源
      最近更新 更多