2011-12-19 75 views
3

我試圖開發一款遊戲,並運行到NSTimer的一個小問題,一旦精靈出現在我的場景中有一定的時間在淡出之前。NSTimer立即開火

double CALC_TIME = 5; 
[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(hideSprite) userInfo:nil repeats:NO]; 

我想在5秒後調用hideSprite,而是立即調用它(或接近即時)。

一個可能的解決方案: 我知道我可以設置定時復讀,並具有設置第一次,然後下一個間隔的衰落做了布爾華美通爲此,計時器是無效的,但我不要認爲這是很好的做法

像這樣:

bool firstCall = false; 
-(void)hideSprite{ 
     if(!firstCall){ 
     firstCall = true 
    }else{ 
     //fade out sprite 
     //Invalidate NSTimer 
     //firstCall = false; 
    } 
} 

感謝您的幫助!

+2

這應該有效。還有其他的錯誤 - 你確定'hideSprite'沒有被其他代碼調用嗎?就像一些測試代碼在計時器設置完成後立即仍然留在那裏一樣? – 2011-12-19 21:40:05

+0

不,我剛剛在那裏檢查,該方法只從一個地方調用, 我添加了一個NSLog,一個在我初始化該方法之後,另一個在它調用的方法中。 保持輸出: _2011-12-19 21:43:11.547擠流EM [14144:10a03]計時器調用 2011-12-19 21:43:11.562擠流EM [14144:10a03],叫做定時器 2011-12-19 21:43:16.582 Squish Em [14144:10a03]計時器被叫做 2011-12-19 21:43:16.596 Squish Em [14144:10a03]叫做Timer_ – Rich 2011-12-19 21:44:40

回答

2

我懷疑別的東西叫hideSprite。您所寫的代碼導致計時器在調用選擇器hideSprite之前等待五秒鐘。

向定時器提供一個不同的選擇器(寫一個新的測試方法,它只是做一個NSLog),看看會發生什麼。這會告訴你a)計時器是否確實立即發射,b)如果有其他事情正在呼叫hideSprite

[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(testTimer) userInfo:nil repeats:NO]; 

-(void) testTimer { NSLog(@"Timer - and only the timer - called me."); } 
-(void) hideSprite { 
    NSLog(@"I definitely wasn't called by the timer."); 
} 
+0

我做了這個,很奇怪,它開始調用這個方法五秒鐘後,我改回它,現在它運行正常,但我不知道爲什麼......謝謝你的幫助,但時間看我的代碼和看看發生了什麼! – Rich 2011-12-19 21:58:41

+2

啊,gremlins。他們是真實的,你知道:) – 2011-12-19 22:03:10

0

考慮使用initWithFireDate:interval:target:selector:userInfo:repeats方法初始化您的計時器。這裏是更詳細的看NSTimer

+0

你能解釋一下爲什麼你認爲這會有幫助嗎? ?使用這種方法意味着計算一個啓動日期而不是僅僅使用一個時間間隔,並且還會對定時器的內存管理產生更多的關注。 – 2011-12-19 21:43:14

1

常常很容易,只需使用類似

[UIView animateWithDuration: 0 delay: 5 options:0 animations: nil completion: 
^{ 
    // fade sprite 
}]; 

(不知道animations可以是零,但你的想法)。

+0

雖然這是解決問題的一種明智方式,但僅僅使用動畫才能觸發具有一定延遲的方法是不正確的。 – FormigaNinja 2016-02-23 02:22:07