2012-01-17 88 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 ...调用来创建循环计时器。