2011-05-10 152 views

回答

2

documents

定時器與運行 環路一起工作。要有效地使用計時器,您應該知道 運行循環的運行方式 - 請參閱NSRunLoop和Threading 編程指南。

一旦計劃在運行循環中, 定時器在指定的時間間隔觸發 ,直到它失效。 A 非重複定時器在其觸發後立即使其自身失效 。但是,對於重複計時器,您必須 通過調用其invalidate方法使自己的計時器對象 無效。 調用此方法請求從當前的 運行循環中刪除定時器 ;因此,您應該始終調用 中的無效方法,該方法與安裝了計時器的相同線程 一致。無效的定時器 立即禁用它,以便它沒有 更長的時間影響運行循環。然後循環運行 刪除並釋放 計時器,或者在 無效方法返回之前,或者在稍後的某個點處,在某些 點。一旦無效,定時器 對象不能重複使用。

我相信NSTimer不會阻塞UI線程。也看看這個以前的問題NSTimer and updating UI

8

這取決於。大多數時候,這不會是一個問題。

如果,但是,兩者的滿足下列標準時,一個NSTimer塊UI線程:

  1. 定時器定於主線程的NSRunLoop。無論何時通過在主線程中調用NStimer的scheduledTimerWith...類方法創建它,都將是這種情況。
  2. 該方法在計時器觸發時調用,執行「冗長」任務。想到同步執行的提取/ url請求會想到...
+0

爲什麼'scheduledTimerWith ...'方法會導致問題?我的計時器正在運行時遇到UI阻塞。我用這種方法創建了它,我沒有意識到這會是一個問題。我的其他選擇是什麼?謝謝。 – user700774 2011-07-13 21:55:01

+1

@ user700774這些方法不是問題。問題是timer-callback中_synchronously_發生的工作量:只要回調函數返回**,定時器觸發的runloop將被阻塞。如果您的回調快速退出,則在主線程上安排定時器時,您將永遠不會注意到這一點。但是,如果你在那裏做了一些耗時的處理(只是使用'sleep(5);'來模擬一個極端情況)......如果是這樣的話,只要做到這一點_asynchronously_ - 'NSOperationQueue'和GCD是你的朋友, 這裏。 – danyowdee 2011-07-15 13:18:29