2013-05-01 31 views
0

我正在使用下面的代碼來發現暫停和取消暫停NSTimer。我討厭不知道代碼是如何工作的,所以我希望有人能給我一個關於這裏發生的事情的簡要解釋。 pause方法中使用的兩個NSDate對象有什麼意義? resume方法中的-1有什麼意義?提前致謝!這個NSTimer Pause/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

恢復代碼不應該在已經初始化的日期使用init方法。改用'-dateByAddingTimeInterval:'代替。 – JeremyP 2013-05-01 18:10:27

回答

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早於「now」。

因此pause通過將火災日期設置爲將來(4001年1月1日)的遙遠日期來「暫停」計時器。

resume將火災日期恢復到舊的火災日期加上在「暫停」和「恢復」之間過去的時間間隔 。

注:作爲@JeremyP在他的評論中發現,

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

是不正確的,因爲它發送一個初始化消息已經初始化的對象previousFireDate。正確(甚至更短)爲:

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

如果你修復發送一個init方法到一個已經初始化的'NSDate'的行,我會給你+1。 – JeremyP 2013-05-01 18:12:49

+0

@JeremyP:對我沒有注意到這點! – 2013-05-01 18:21:53

+0

有道理,謝謝:) – Luke 2013-05-01 20:45:26