更新的UILabel和UIButton的立即

问题描述:

在一个项目中,我更改UILabel的文本用的setText,一个UIButton的颜色,之后做一个耗时的计算,其次是动画。更新的UILabel和UIButton的立即

然而,在执行计算后的文本的和颜色的改变反映(和动画开始之前),但是我要计算之前立即反映更改(如你猜它是一个等待文本)

如何我可以做到这一点吗?

将计算移出主线程。当运行循环获取的时间内进行

所有的绘制。如果您正在主线程上执行计算,则会阻止运行循环并因此阻止绘图。计算完成后,使用performSelectorOnMainThread启动动画或在计算完成时需要在UI中发生的其他任何事情。

编辑:

主线程上执行你的计算,但给运行循环的机会,更新UI是一个延迟调用的快捷方式。使用0.1秒左右的延迟。你可以用NSTimer做基本相同的事情。这是NSRunLoop.h

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

+0

其实计算的阻止用户界面是为我好,是不是有没有办法跟你说做我的更新,然后开始计算,并且你可以自由地阻止任何“:) – 2010-05-07 09:10:43

+0

您可以放心地指定一个零延迟。这使程序流程返回到运行循环,然后立即执行延迟的方法。 – 2010-05-07 10:48:17

开始在后台线程中运行计算。

我认为你最好的选择是在后台线程中执行你耗时的动画。这样你的主UI线程就不会被阻塞,文本和颜色也会立即改变。您的UI在执行计算时也会保持响应。

总的来说这是一个好主意,不要堵塞了沉重的计算主线程,因为这给人的应用不是非常敏感的外观。

如果在计算最简单的方法是避免线程,你并不需要一个负责任的接口:把时间在自己的方法耗时计算,并启动使用[calculator performSelector:@selector(calculateThis:) withObject:myArgument afterDelay:0]

这将允许运行的循环更新您界面的变化,然后开始在主线程的计算(阻止它)。

+0

开始音频录制的完美解决方案,在第一次初始化时可能会有几秒钟的设置延迟,因此阻止该线程对我来说很有意义。 – 2011-02-16 12:43:37