0

我正在使用以下代码来暂停和取消暂停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]];
}
4

1 回答 1

4

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

09:00pause执行操作:

// 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:10resume执行操作:

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

是不正确的,因为它向已经初始化的 object 发送了一个 init 消息previousFireDate。正确(甚至更短)是:

[self setFireDate:[previousFireDate dateByAddingTimeInterval:pauseTime]];
于 2013-05-01T17:33:19.193 回答