代码之家  ›  专栏  ›  技术社区  ›  Rahul Vyas

如何使用nsdate运行倒计时?

  •  1
  • Rahul Vyas  · 技术社区  · 15 年前

    我开发了一个应用程序,在其中运行一个倒计时计时器。计时器每秒触发一个方法。但是,当手机处于睡眠模式时,计时器会变慢甚至关闭。

    我想我需要通过使用nsdate计算时间间隔来更新变量。有人知道怎么做吗?

    顺便说一句,我们的客户已经发送了以下反馈:

    计时器问题似乎是由 因为代码假定 计时器通知消息是 只在一秒钟内送达,但是 不是。当应用程序运行时,但是 手机处于待机状态,它使用 计时器更新倒计时计时器。 但是计时器来的更慢 不到一秒钟,所以倒计时 计时器关闭。应用程序应该是 重新加工以始终更新 基于电流的倒计时计时器 时间,而不是基于 计时器消息本身。(其他) 文字,当一秒钟的信息 进来,总是假设 额外的时间过去了,而且 计算剩余时间 从目标时间中减去。这个 当你重新启动 app——计算出目标时间 当前时间减去1 从另一个更新 屏幕计时器。嗯,就是这样 应该一直这样做。)

    如果有人知道我们到底需要什么,请告诉我。

    2 回复  |  直到 15 年前
        1
  •  5
  •   TechZen    15 年前

    计时员不应该用来实际计时。它们依赖于运行循环,因此运行时间很长的代码会干扰它们。

    你应该停止计时器 applicationWillResignActive: 继续(实际上,创建另一个计时器) applicationDidBecomeActive: .

    要计算日期,您需要如下所示:

        NSDate *startDate=[NSDate date];
        NSDate *endDate=[startDate addTimeInterval:someSeconds];
        NSTimeInterval secsElapsed;
        ...
    
    -(void) timerDidFire:(NSTimer *) aTimer{
        NSDate *dateNow=[NSDate date];
        if ([[dateNow laterDate:endDate] isEqual:endDate]) {
            [aTimer invalidate];
            // end countdown
        }else {
            secsElapsed=[dateNow timeIntervalSinceDate:startDate];
        }
    }
    
        2
  •  2
  •   Jeffrey Aylesworth    15 年前

    使用纪元时间。epoch time是自1970年1月1日以来的秒数。

    当程序启动时,保存当前的epoch时间

    double start = [[NSDate date] timeIntervalSince1970];
    

    当你更新计时器时,

    double running = [[NSDate date] timeIntervalSince1970] - start;
    

    会告诉你多少秒过去了 start .