當我們使用NSTimer時,一旦在提到的時間間隔後調用回調,UI是否會被阻塞?NSTImer事件會阻塞主線程嗎?
4
A
回答
2
定時器與運行 環路一起工作。要有效地使用計時器,您應該知道 運行循環的運行方式 - 請參閱NSRunLoop和Threading 編程指南。
一旦計劃在運行循環中, 定時器在指定的時間間隔觸發 ,直到它失效。 A 非重複定時器在其觸發後立即使其自身失效 。但是,對於重複計時器,您必須 通過調用其invalidate方法使自己的計時器對象 無效。 調用此方法請求從當前的 運行循環中刪除定時器 ;因此,您應該始終調用 中的無效方法,該方法與安裝了計時器的相同線程 一致。無效的定時器 立即禁用它,以便它沒有 更長的時間影響運行循環。然後循環運行 刪除並釋放 計時器,或者在 無效方法返回之前,或者在稍後的某個點處,在某些 點。一旦無效,定時器 對象不能重複使用。
我相信NSTimer
不會阻塞UI線程。也看看這個以前的問題NSTimer and updating UI
8
這取決於。大多數時候,這不會是一個問題。
如果,但是,兩者的滿足下列標準時,一個NSTimer
將塊UI線程:
- 定時器定於主線程的
NSRunLoop
。無論何時通過在主線程中調用NStimer的scheduledTimerWith...
類方法創建它,都將是這種情況。 - 該方法在計時器觸發時調用,執行「冗長」任務。想到同步執行的提取/ url請求會想到...
相關問題
- 1. 在gui事件後阻塞主線程
- 2. 更新tableView不會阻塞主線程
- 3. NSTask阻塞主線程
- 4. NSoperationQueue阻塞主線程
- 5. 隊列阻塞主線程
- 6. QMessageBox會阻塞Qt中整個主線程的運行嗎?
- 7. 防止tcl線程被主事件循環阻塞
- 8. SFML窗口調整大小事件阻塞主線程
- 9. Thread.sleep()方法阻塞主UI線程
- 10. Vertx單元測試阻塞主線程
- 11. 更新GMSMarkers沒有阻塞主線程
- 12. 子窗口阻塞主線程
- 13. MVC Ajax請求不阻塞主線程
- 14. 請問applicationDidBecomeActive:阻塞主線程?
- 15. 阻塞隊列不阻塞線程?
- 16. 阻塞線程 - Java
- 17. Java線程阻塞
- 18. Java線程阻塞
- 19. MessageBeep線程阻塞
- 20. 關閉流阻塞線程嗎?
- 21. 目標C:阻塞線程直到NSTimer完成(iOS)
- 22. 爲什麼NSTimer在另一個線程運行時被阻塞?
- 23. 如何使用異步事件管理線程阻塞和解除阻塞?
- 24. ExecutorService超時而不會阻塞主線程
- 25. 如何讓CATiledLayer不會阻塞主線程
- 26. 是否會在Node.js中阻塞主線程?
- 27. 將線程阻塞轉換爲f中的非線程阻塞#
- 28. STA線程模式線程也會阻塞winform UI線程?
- 29. 其他線程會在CUDA中的代碼中阻塞嗎?
- 30. 線程處理事件被處理程序阻塞了?
爲什麼'scheduledTimerWith ...'方法會導致問題?我的計時器正在運行時遇到UI阻塞。我用這種方法創建了它,我沒有意識到這會是一個問題。我的其他選擇是什麼?謝謝。 – user700774 2011-07-13 21:55:01
@ user700774這些方法不是問題。問題是timer-callback中_synchronously_發生的工作量:只要回調函數返回**,定時器觸發的runloop將被阻塞。如果您的回調快速退出,則在主線程上安排定時器時,您將永遠不會注意到這一點。但是,如果你在那裏做了一些耗時的處理(只是使用'sleep(5);'來模擬一個極端情況)......如果是這樣的話,只要做到這一點_asynchronously_ - 'NSOperationQueue'和GCD是你的朋友, 這裏。 – danyowdee 2011-07-15 13:18:29