2011-02-11 71 views
1

让我们假设我们有简单的用户界面,无论出于何种原因,每5秒需要更新一次UILabel。NSTimer与单独的线程 - 哪一个可供选择?

我现在可以设置一个NSTimer来完成这项工作,或者创建一个独立运行的线程,可以休眠5秒钟,完成它的任务,再次休眠等等。

我会选择哪一个?有什么区别?

回答

1

无论如何,您必须对主线程执行UI操作,因此除非您在设置标签之前进行一些处理,否则使用其他线程将不会有好处。

+0

因此,在NSTimer回调中,我不必“在主线程上调用”,但是在单独的“我将不得不? 但是,如果计算标签的值需要一些时间,NSTimer解决方案会中断代码执行并使UI感觉迟缓。那么一个线程将是一个更好的选择。正确? – Krumelur 2011-02-11 10:55:53

1

UI只能在任何程序的主线程上更新。如果您想在单独的线程中对标签进行计算,那就很好了,但更新UI的代码必须在主线程上运行(或者,您可以使用performSelectorOnMainThread:withObject:waitUntilDone:在标签上调用setText:并使其运行正确)。

1

使用NSTimer

为什么?

  1. 只要引入额外的线程,就可能引入一个全新的错误类,即线程同步问题。由于它们的不确定性,这些诊断和解决起来很困难。
  2. 无论如何,你必须在主线程上进行UI更新。所以你的线程必须做-performSelectorOnMainThread:withObject:waitUntilDone:更新用户界面。

如果标签的计算需要一段时间(不只是假设他们这样做,尝试简单的方法第一,看看),让您的计时器开球的NSOperation做计算,然后有NSOperations完成后请致电-performSelectorOnMainThread:withObject:waitUntilDone: