2011-02-11 24 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: