NSTimer Pause / Resume如何工作?

时间:2013-05-01 17:13:34

标签: objective-c nstimer

我使用以下代码暂停和取消暂停NSTimer。我不想知道代码是如何工作的,所以我希望有人能给我一个简短的解释,说明这里发生了什么。 NSDate方法中使用的两个pause对象的重要性是什么? -1方法中resume的重要性是什么?提前谢谢!

- (void) pause
{
    pauseStart = [NSDate dateWithTimeIntervalSinceNow: 0];
    previousFireDate = [self fireDate];
    [self setFireDate: [NSDate distantFuture]];
}

- (void) resume
{
    // 
    float pauseTime = -1 * [pauseStart timeIntervalSinceNow];
    [self setFireDate: [previousFireDate initWithTimeInterval: pauseTime sinceDate: previousFireDate]];
}

1 个答案:

答案 0 :(得分:4)

我们假设您的计时器今天将在11:00开火。 (为简单起见,我在评论中仅使用HH:MM作为日期。)

在09:00执行pause操作:

// pauseStart = current date/time ("now") = 09:00:
pauseStart = [NSDate dateWithTimeIntervalSinceNow: 0];
// previousFireDate = 11:00:
previousFireDate = [self fireDate];
// set new fireDate to something far far away to prevent timer from firing:
[self setFireDate: [NSDate distantFuture]]; 

在09:10执行resume操作:

// pauseTime = difference between "pause" and "resume" (now) = 10 minutes:
float pauseTime = -1 * [pauseStart timeIntervalSinceNow];
// set new fireDate = previous fireDate + pauseTime = 11:10:
[self setFireDate: [previousFireDate initWithTimeInterval: pauseTime sinceDate: previousFireDate]];

因子(-1)是必需的,因为pauseStart早于“现在”。

所以pause通过将开火日期设置为将来的远期日期(4001年1月1日)来暂停“计时器”。

resume将开火日期恢复为旧开火日期加上经过的时间间隔 在“暂停”和“恢复”之间。

备注:正如@JeremyP在评论中注意到的那样,

[self setFireDate: [previousFireDate initWithTimeInterval: pauseTime sinceDate: previousFireDate]];

不正确,因为它会向已初始化的对象previousFireDate发送init消息。正确(甚至更短)是:

[self setFireDate:[previousFireDate dateByAddingTimeInterval:pauseTime]];