【问题标题】:UIView setNeedsDisplay Not on main thread?UIView setNeedsDisplay 不在主线程上?
【发布时间】:2011-03-21 20:41:48
【问题描述】:

在我的 iPhone 应用程序中,我有一个辅助线程,用于在后台执行任务,每隔几毫秒,必须更新一次视图(而不是从主线程)。我在 UIView 子类中尝试了以下代码:

 [self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];

这在模拟器上效果很好,但是在我的设备上,它非常滞后。我唯一能想到的是主线程被 UIKit 的常规例程所困,这意味着我的 setNeedsDisplay 在它应该调用的时候被调用了很长时间(大约 1/2 秒后)。我认为这是因为在其他代码中,基于用户交互,我立即调用 setNeedsDisplay,它运行良好,完全没有任何延迟。辅助线程上的后端计算少于用户界面线程上的后端计算。这会在我的应用程序中导致一些非常糟糕的视觉效果。

所以,总结一下,我该如何解决这个问题?


更新:

我是否有另一种方法可以告诉视图它需要每秒刷新 x 次?如果可能的话,这最终可能对我来说是更好的表现。我试过 CADisplayLink 没有成功...

【问题讨论】:

    标签: iphone objective-c multithreading uiview setneedsdisplay


    【解决方案1】:

    如果您的 UI 受到严重打击,以至于您的通话延迟了这么多,请尝试对 UI 更新进行一些批处理和/或围绕 TableView 更新的批处理执行 beginUpdate/endUpdate(例如)。

    我在 MonoTouch 中做类似的事情,我没有看到任何滞后。我的所有更新都来自后台线程,方式与您的应用相同。

    或者,如果您的主 UI 可以使用更多 CPU 时间,请尝试降低后台线程优先级,看看是否有帮助。

    【讨论】:

    • 没关系,我使用了[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES];,现在似乎可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多