1

我有一个方法每 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 对象上。

我希望有一种更一致的方法来执行连续动作,但这个问题的解决方案也很重要。

4

2 回答 2

0

这是一个相当常见的问题,因为NSTimer创建的 withscheduledTimerWith...可能会在用户交互时暂停。这是一个类似的问题。正如您想象的那样,这些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.

于 2012-01-17T16:51:07.773 回答
0

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

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

加上这种方法需要调用 setNeeds ,如果调用周期以某种方式被中断,它将永远不会恢复,您应该使用 NSTimer +scheduledTimer... 调用来创建一个循环计时器。

于 2012-01-17T17:29:57.890 回答