如何阻止UIView中断performSelector

时间:2012-01-17 15:49:21

标签: ios cocoa-touch cocoa nstimer performselector

我有一个方法,每隔0.01秒运行一次performSelector,以便不断更新图像。

-(void)setNeeds

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

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

当正常的用户交互时,这会更新。但是,当用户在UIViewPicker上滑动值时,所有更新都会暂停,直到交互停止。在重复时设置NSTimer对象也会发生同样的事情。

我希望采用更加一致的方法来执行连续操作,但解决这个问题的方法也很重要。

2 个答案:

答案 0 :(得分:0)

这是一个相当常见的问题,因为使用NSTimer创建的scheduledTimerWith...可能会在用户互动时暂停。 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

答案 1 :(得分:0)

将所有内容标记为需要每隔1/100秒显示一次,不会给出100fps的帧速率,标记需要显示的内容只会让视图有机会在下一次通过主运行循环时绘制。< / p>

如果绘图需要1/10秒,那么你将获得10fps ......

加上这种方法需要调用setNeeds,并且如果该调用周期以某种方式被中断,它将永远不会恢复,您应该使用NSTimer + scheduledTimer ...调用来制作定期计时器。