像UIKit這樣大的框架上確保線程安全是一個(gè)重大的任務(wù),會(huì)帶來巨大的成本。UIKit不是線程安全的,假如在兩個(gè)線程中設(shè)置了同一張背景圖片铐尚,很有可能就會(huì)由于背景圖片被釋放兩次,使得程序崩潰。或者某一個(gè)線程中遍歷找尋某個(gè)subView,然而在另一個(gè)線程中刪除了該subView桨武,那么就會(huì)造成錯(cuò)亂性誉。apple有對大部分的繪圖方法和諸如UIColor等類改寫成線程安全可用倾哺,可還是建議將UI操作保證在主線程中。
事實(shí)上在子線程中如果要對其他UI 進(jìn)行更新,必須等到該子線程運(yùn)行結(jié)束昧穿,而對響應(yīng)用戶點(diǎn)擊的Button的UI更新則是及時(shí)的初坠,不管他是在主線程還是在子線程中做的更新吴菠,意義都不大了榨乎,因?yàn)樽泳€程中對所有其他ui更新都要等到該子線程生命周期結(jié)束才進(jìn)行谦屑。
在子線程中是不能進(jìn)行UI 更新的,我們看到的UI更新其實(shí)是子線程代碼執(zhí)行完畢了滞欠,又自動(dòng)進(jìn)入到了主線程,執(zhí)行了子線程中的UI更新的函數(shù)棧参淹,這中間的時(shí)間非常的短,就讓大家誤以為分線程可以更新UI颓哮。如果子線程一直在運(yùn)行庸疾,則子線程中的UI更新的函數(shù)棧 主線程無法獲知揍拆,即無法更新。只有極少數(shù)的UI能直接進(jìn)行UI更新塞淹,因?yàn)殚_辟線程時(shí)會(huì)獲取當(dāng)前環(huán)境冯袍,如點(diǎn)擊某個(gè)按鈕,這個(gè)按鈕響應(yīng)的方法是開辟一個(gè)子線程,在子線程中對該按鈕進(jìn)行UI 更新是能及時(shí)的,如上面的換背景圖缤灵,但這沒有任何意義馋劈。