Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用NSDate运行倒计时?_Objective C_Iphone Sdk 3.0_Nstimer - Fatal编程技术网

Objective c 如何使用NSDate运行倒计时?

Objective c 如何使用NSDate运行倒计时?,objective-c,iphone-sdk-3.0,nstimer,Objective C,Iphone Sdk 3.0,Nstimer,我已经开发了一个应用程序,其中我正在运行一个倒计时计时器。计时器每秒触发一个方法。但是,当手机处于睡眠模式时,计时器会变慢甚至关闭 我想我需要通过使用NSDate计算时间间隔来更新变量。有人知道怎么做吗 顺便说一句,我们的客户发送了以下反馈: 计时器问题似乎是由以下原因引起的 代码假设 计时器通知消息如下所示: 正好在一秒钟内送达,但是 不是。当应用程序正在运行但 手机处于待机状态,使用 定时器更新倒计时定时器。 但计时器的速度要慢得多 超过一秒,所以倒计时 定时器关了。应用程序应该是 修改以始

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

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

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

计时器问题似乎是由以下原因引起的 代码假设 计时器通知消息如下所示: 正好在一秒钟内送达,但是 不是。当应用程序正在运行但 手机处于待机状态,使用 定时器更新倒计时定时器。 但计时器的速度要慢得多 超过一秒,所以倒计时 定时器关了。应用程序应该是 修改以始终更新 基于当前值的倒计时计时器 时间,而不是根据时间倒数 计时器消息本身。(其他 文字,当一秒钟的信息 进来时,总是假设 额外的时间已经过去了 按以下公式计算剩余时间: 从目标时间中减去。这个 是指当您重新启动 应用程序——它计算出目标时间 当前时间减去一 从另一个,并更新 屏幕计时器。好吧,就是这样 我们应该一直这样做。)


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

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

程序启动时,保存当前历元时间

double start = [[NSDate date] timeIntervalSince1970];
然后当你更新计时器时

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

将告诉您自
启动以来经过了多少秒

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

程序启动时,保存当前历元时间

double start = [[NSDate date] timeIntervalSince1970];
然后当你更新计时器时

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

将告诉您自
开始以来已过了多少秒

时间不应用于实际计时。它们依赖于运行循环,因此可能会受到运行时间较长的代码的干扰

您应该在
applicationWillResignActive:
中停止计时器,并在
applicationdidebomeactive:
中继续(实际上,创建另一个计时器)

要计算日期,您需要以下内容:

    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];
    }
}

NSTimer永远不应该用于实际计时。它们依赖于运行循环,因此可能会受到运行时间较长的代码的干扰

您应该在
applicationWillResignActive:
中停止计时器,并在
applicationdidebomeactive:
中继续(实际上,创建另一个计时器)

要计算日期,您需要以下内容:

    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];
    }
}
[NSDate date]是当前时间。[NSDate date]是当前时间。