假设您的计时器将在今天 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]];