爲什麼都要在主線程中更新UI(iOS開發)

在 iOS開發過程中,我一直知道更新UI需要在主線程中,但也沒怎麼細想爲什麼要在主線程中,或者說爲什麼不能在子線程中更新UI。今天抽空自己在網上查查資料 ,瞭解一下這個問題。

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

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

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



文/文小武數遍生命的公路牌wow(簡書作者)
原文鏈接:http://www.jianshu.com/p/7e4fbde8b53f
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章