2010-08-24 81 views
0

有没有办法手动更新用户界面?例如,我有一个更新UI并执行一些逻辑的功能。 UI更新后,它将执行一些需要很长时间的逻辑,UI的更新必须等待直到逻辑执行完成。 即使逻辑甚至被执行,是否有手动更新UI的方法?手动更新用户界面

看来,线程可以在这里使用。 但有没有办法解决这个不使用线程? 另外,如果可以使用线程,那么最佳实践是什么?

谢谢!

回答

1

由于UI线程是应用程序的主线程,因此在此期间处理大型操作通常不是一个好主意,因为您在此期间冻结了用户界面(这不方便用户使用)。

你使用线程的方式取决于你想要做什么,你可以例如只使用- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg或者你可以创建自己的线程和更具体。

如果您想在其他线程的UI上进行一些更改,请不要忘记调用- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

从iOS参考资料库中,您可以在guide中找到关于线程编程的所有需求。

希望这会有所帮助!

+0

感谢您的回复Ermiar。 当你需要更新一个UI然后另一个UI但不是同时更新时,这个更新问题实际上发生了很多。 让我举个例子。 假设我想关闭一个控制器,调用这个控制器1,然后右击一个控制器,调用该控制器2.控制器2的父控制器是controller1,控制器1的父控制器是控制器。 然后这个问题就会发生。它实际上会解雇第一个控制器,但不会解散第二个控制器。 您是否认为这种情况下,我们没有其他选择,只能创建一个新的线程? – 2010-08-26 15:39:37

+0

此外,我正在使用一种非常黑客的方式来解决这个问题。 我正在使用NSTimer解雇controller1。 只是好奇,当使用NSTimer时,它是否创建另一个线程? – 2010-08-26 15:40:36

+0

这取决于你如何初始化定时器,如果使用scheduledTimerWithTimeInterval,定时器将在当前线程的当前循环中创建。否则,您必须将计时器添加到其他线程的运行循环中。 你可以使用其他方法在延迟如performSelector后在当前线程中执行动作:withObject:afterDelay:如果你只想等待一些东西。 – Ermiar 2010-08-26 16:51:20

0

你在想一个简单的进度条吗?如果是这种情况,那么你可以使用NSApp的东西(请参阅管理事件循环部分)并使用runModalForWindow:和runModalSession:这些将允许您打开进度面板,报告状态并允许方法取消操作。

由于操作是模式化的,所以其他UI元素将被停用,直到面板被解散。

+0

我在这里谈论可可触摸层的UIkit。 不是从基础层以后的Appkit ... – 2010-08-26 15:43:06