2016-07-25 31 views
-1

難道我們不能創建一個不同的線程並啓動一個可以監聽觸摸事件或與UI相關的任何事情的runloop嗎?是否有任何研究正在處理多線程環境中的UI任務?爲什麼我們應該在主線程上執行所有與UI相關的任務?

+1

這是非常古老的,但可能是有用的:https://community.oracle.com/blogs/kgh/2004/10/19/multithreaded-toolkits-failed-dream – Anshu

回答

3

UIKit不是內部線程安全的。

我覺得我應該進一步解釋,但那真的是整個答案。在蘋果以外的領域沒有研究,因爲只有Apple維護UIKit。他們不大可能會大規模地重寫UIKit以使其線程安全,更不用說他們這樣做會導致嚴重的性能損失。除非文檔中另有明確說明,否則必須在主線程上執行所有UI事件和主要上下文繪製工作。

也許值得再深入一點:對於多線程用戶界面非常有限。每個像素一次只能顯示一件東西。電容式觸摸傳感器一次只能發送一個信號。只有一個用戶界面。 concurrency and/or parallelism的承諾是我可以更好地同時解決這個問題,或者我可以更好地使用並行硬件。我不能實際上在同一時間畫兩件事。只有一個屏幕。最終我正在繪製一件事。一堆曲線,在一天結束時,仍然是一個「圖片」。它被合成並繪製成一個單一的東西。這與計算工作形成對比。我可以用實際上同時計算兩條貝塞爾曲線,完全並行,並且更多地使用硬件。這是我今天可以在其他線索上做的事情。

這並不是說UIKit內部沒有並行性。軟件和硬件都有。但是提供用於UI處理的可重入API的高複雜性和性能開銷並沒有什麼重大價值。此外,用戶界面是關於你可以擁有的最有狀態的東西,可變狀態是多線程代碼的死敵。即使它很有價值,UI代碼對於重入和線程安全來說尤其具有挑戰性。正如你注意到的那樣,這在許多平臺上或多或少都是如此。

+0

但我覺得在其他技術,無論是新的或舊的,不支持用於UI任務的多線程。難以實現還是根本不可能? – Anshu

相關問題