難道我們不能創建一個不同的線程並啓動一個可以監聽觸摸事件或與UI相關的任何事情的runloop嗎?是否有任何研究正在處理多線程環境中的UI任務?爲什麼我們應該在主線程上執行所有與UI相關的任務?
回答
UIKit不是內部線程安全的。
我覺得我應該進一步解釋,但那真的是整個答案。在蘋果以外的領域沒有研究,因爲只有Apple維護UIKit。他們不大可能會大規模地重寫UIKit以使其線程安全,更不用說他們這樣做會導致嚴重的性能損失。除非文檔中另有明確說明,否則必須在主線程上執行所有UI事件和主要上下文繪製工作。
也許值得再深入一點:值對於多線程用戶界面非常有限。每個像素一次只能顯示一件東西。電容式觸摸傳感器一次只能發送一個信號。只有一個用戶界面。 concurrency and/or parallelism的承諾是我可以更好地同時解決這個問題,或者我可以更好地使用並行硬件。我不能實際上在同一時間畫兩件事。只有一個屏幕。最終我正在繪製一件事。一堆曲線,在一天結束時,仍然是一個「圖片」。它被合成並繪製成一個單一的東西。這與計算工作形成對比。我可以用實際上同時計算兩條貝塞爾曲線,完全並行,並且更多地使用硬件。這是我今天可以在其他線索上做的事情。
這並不是說UIKit內部沒有並行性。軟件和硬件都有。但是提供用於UI處理的可重入API的高複雜性和性能開銷並沒有什麼重大價值。此外,用戶界面是關於你可以擁有的最有狀態的東西,可變狀態是多線程代碼的死敵。即使它很有價值,UI代碼對於重入和線程安全來說尤其具有挑戰性。正如你注意到的那樣,這在許多平臺上或多或少都是如此。
但我覺得在其他技術,無論是新的或舊的,不支持用於UI任務的多線程。難以實現還是根本不可能? – Anshu
- 1. 爲什麼iOS中的UI相關任務必須在主線程上執行?
- 2. 在UI線程上執行長任務
- 3. 何時應該與主線程異步執行任務?
- 4. startActivity應該在主線程上執行?
- 5. 應用程序應該執行與窗口管理相關的任務嗎?
- 6. 爲什麼當我在UI線程上運行它時,必須在主UI線程上調用'setAdListener'
- 7. 爲什麼android UI在主線程上運行?
- 8. 爲什麼在主線程上運行?
- 9. 試圖與tkinter(tkinter是在主線程上)運行線程執行任務,而是它停止主線程
- 10. 爲什麼在主線程中運行任務?
- 11. 當我們有Specflow時,爲什麼我們應該使用編碼的UI?
- 12. 爲什麼任務沒有執行?
- 13. 爲什麼Android服務需要在UI線程上運行?
- 14. 爲什麼線程池工作項目在UI線程上執行?
- 15. Qt:爲什麼我的paintEvent()在執行任務前抹去所有東西?
- 16. 爲什麼我們應該寫所有這些步驟用java
- 17. 繼續在主線程上執行任務
- 18. 在UI線程上運行什麼?
- 19. 執行所有查詢或什麼都不應該執行
- 20. RunWorkerCompleted未在主UI線程中執行?
- 21. 爲什麼我所有的mpi線程都是主人?
- 22. 爲什麼在所有任務完成執行後我都會收到空值
- 23. 爲什麼我們不應該在UI層中嵌入業務邏輯?
- 24. 爲什麼在主線程上繪製UI?
- 25. onLocationChanged回調是在什麼線程上進行的?主UI線程?
- 26. 爲什麼在UI上調用啓動一個新的任務線程
- 27. 什麼時候應該在另一個線程(而不是主線程)上執行某些SQLite操作?
- 28. 細粒度多線程 - 工作任務應該執行多少?
- 29. 爲什麼我們應該在proguard.cfg中使用關鍵字「-keep」
- 30. 計劃在UI線程vs UI上運行的TPL任務線程
這是非常古老的,但可能是有用的:https://community.oracle.com/blogs/kgh/2004/10/19/multithreaded-toolkits-failed-dream – Anshu