2008-10-30 65 views
1

我使用,我第一次在超負荷的touchesBegan設置一個NSTimer實現自來水和保持處理。定時器和動畫事件勝過TouchesEnded事件

不過,我真正想要的是要在正在舉行的觸摸來連續快速連續火執行的操作。所以,在定時器到期時,我調用一個處理程序來完成工作,然後設置另一個定時器,循環繼續,直到TouchesEnded進入並取消它,或者滿足另一個終止條件。

這工作得很好,直到我的處理程序代碼觸發動畫在同一時間熄滅。 現在我們有動畫事件和計時器事件,以及我們需要處理TouchesEnded的所有事情。

我在找的是,如果動畫被觸發,並且我的計時器設置小於0.025秒,我的TouchesEnded事件不會通過,直到定時器週期停止(另一個終止條件)。設置一個較慢的定時器,或不觸發動畫,使其工作(TouchedEnded馬上就來),但不是我想要的。

顯然,這是所有的設備上(發佈版本 - 無NSLogs) - 在SIM一切工作正常

有沒有設置這些事件的相對先決任何方式 - 或者是它可能我在這裏丟失了其他的東西?

 
[Update] 

我,直到它完成(從這個角度看用戶是瞬發)無視覺反饋做連續部分圍繞這個工作在這種情況下。我認爲現在可以。我仍然想聽到更多的想法(傑弗裏的想法很好),但我現在沒有等待提心吊膽。

+0

感謝您調整標籤,克里斯 - 這可能有助於讓更多的人看到這個問題。 – philsquared 2008-10-31 16:20:22

回答

1

嘗試通過產卵關到一個線程編寫自己的定時器型類。例如:

BOOL continue = YES; //outside of your @implementation 

-(void)doLoop 
{ 
    while(continue){ 
     [NSThread sleepForTimeInterval:.025]; 
     [self performSelectorOnMainThread:@selector(whateverTheFunctionIs) waitUntilDone:YES]; 
    } 
} 

並且這將由[NSThread detatchNewThreadSelector:@selector(doLoop) toTarget:self withObject:nil]開始。這並不完全是線程安全的,但是您可以選擇將布爾值封裝到NSNumber中,然後在您選擇時對其執行@synchronize。或者,在我寫了一小段代碼後,我意識到最好對當前的NSTime進行檢查,而不是sleepForTimeInterval:但是你明白了。 :)

+0

謝謝Jeffrey。我不確定這是否是我正在尋找的答案,但它肯定是值得嘗試的東西,我可以通過這種方式控制優先級 - 儘管對於動畫來說仍然不是這樣。暫時保持這種狀態 - 但感謝您的答覆(並投票支持)。 – philsquared 2008-11-01 15:54:11