【问题标题】:How to stop UIView from interrupting performSelector如何阻止 UIView 中断 performSelector
【发布时间】:2012-02-12 10:19:34
【问题描述】:

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

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

【问题讨论】:

    标签: ios cocoa-touch cocoa nstimer performselector


    【解决方案1】:

    这是一个相当常见的问题,因为使用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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 2017-01-01
        • 2018-09-03
        • 2015-11-27
        相关资源
        最近更新 更多