2012-01-17 69 views
1

我有一個方法運行performSelector自己每0.01秒,以不斷更新圖像。如何停止UIView從中斷performSelector

-(void)setNeeds 

[mag setNeedsDisplay]; 
[vc setNeedsDisplay]; 
[na setNeedsDisplay]; 
[wave setNeedsDisplay]; 
[mon setNeedsDisplay]; 

[self performSelector:@selector(setNeeds) 
      withObject:NULL 
      afterDelay:.01]; 

當正常的用戶交互時,這個更新很好。但是,當用戶在UIViewPicker上滑動值時,所有更新都會暫停,直到交互停止。在重複設置NSTimer對象時會發生同樣的情況。

我希望有一個更一致的方法來執行連續的動作,但解決這個問題的辦法也是隆重的。

回答

0

這是一個相當常見的問題,因爲用scheduledTimerWith...創建的NSTimer在用戶交互時可能會暫停。 Here is a similar question。就像你想象的那樣,performSelector:..afterDelay:..方法在內部使用NSTimer。基本上,當您使用scheduledTimerWith...performSelector:..afterDelay:..時,您的計時器將在運行循環中安排爲NSDefaultRunLoopMode,在用戶與應用程序進行交互時可能會暫停。解決的辦法是安排在跑環自己定時器CommonModes像這樣:

timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(setNeeds) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

如果你反對管理自己的NSTimer這個功能,那麼你可以使用performSelector:withObject:afterDelay:inModes:功能。最後一個參數是一系列運行循環模式,您可以在其中輸入NSRunLoopCommonModes

0

當需要顯示的每一百分之一秒都不會給你一個100fps的幀速率,標記出需要的東西,只顯示一個視圖在主運行循環的下一個通道上繪製的機會。

如果圖紙需要花費一秒鐘,那麼你會得到10FPS的1/10 ......

加上這種方法需要被稱爲setNeeds,如果這一呼籲週期由於某種原因中斷它永遠不會恢復,你應該使用NSTimer + scheduledTimer ...調用來創建循環計時器。