為何要在主執行緒上更新UI

weixin_33782386發表於2018-08-23

像UIKit這樣大的框架上確保執行緒安全是一個重大的任務,會帶來巨大的成本。UIKit不是執行緒安全的,假如在兩個執行緒中設定了同一張背景圖片,很有可能就會由於背景圖片被釋放兩次,使得程式崩潰。或者某一個執行緒中遍歷找尋某個subView,然而在另一個執行緒中刪除了該subView,那麼就會造成錯亂。apple有對大部分的繪圖方法和諸如UIColor等類改寫成執行緒安全可用,可還是建議將UI操作保證在主執行緒中。

事實上在子執行緒中如果要對其他UI 進行更新,必須等到該子執行緒執行結束,而對響應使用者點選的Button的UI更新則是及時的,不管他是在主執行緒還是在子執行緒中做的更新,意義都不大了,因為子執行緒中對所有其他ui更新都要等到該子執行緒生命週期結束才進行。

在子執行緒中是不能進行UI 更新的,我們看到的UI更新其實是子執行緒程式碼執行完畢了,又自動進入到了主執行緒,執行了子執行緒中的UI更新的函式棧,這中間的時間非常的短,就讓大家誤以為分執行緒可以更新UI。如果子執行緒一直在執行,則子執行緒中的UI更新的函式棧 主執行緒無法獲知,即無法更新。只有極少數的UI能直接進行UI更新,因為開闢執行緒時會獲取當前環境,如點選某個按鈕,這個按鈕響應的方法是開闢一個子執行緒,在子執行緒中對該按鈕進行UI 更新是能及時的,如上面的換背景圖,但這沒有任何意義。

相關文章