8

什麼是正確的做法?該NSTimer文檔這樣說:安排GCD串行隊列上的NSTimers是否安全?

特別注意事項

必須從線程發送這封郵件上安裝了定時器 。如果您從另一個 線程發送此消息,則與定時器關聯的輸入源可能不會從其運行循環中被移除 ,這可能會阻止線程正確退出 。

由於GCD不向你保證,一個串行隊列將始終是相同的線程上運行塊,什麼是正確的方法,以確保您安排和無效在同一線程上的NSTimer

編輯:

按照下面的答案的提醒,我創建MSWeakTimerhttps://github.com/mindsnacks/MSWeakTimer),這是使用GCD可以從任何隊列中使用的自定義計時器實現。

+0

MSWeakTimer的+1 ...解決了我們可怕的記憶問題! – jowie

回答

9

您不應該在由GCD管理的匿名工作線程上安裝NSTimer

使用帶GCD的調度計時器源代替NSTimer,c.f. dispatch_source_create(3)。

NSTimer依賴於當前線程的runloop,這對於GCD隊列來說並不合適。有關GCD和runloop API的更多詳細信息,請參閱WWDC2012 GCD會話。

+0

這很有道理。我想唯一的例外是主隊列,我說得對嗎? –

+0

是正確的,只要一個進程沒有調用dispatch_main(3),主runloop和主隊列被綁定並保證在主線程上執行。 – das

+1

https://github.com/mindsnacks/MSWeakTimer –